化的过程中,事务不但能够减少与数据库操作的次数,而且根据事务的四个特性可以提供更好的安全性。我们来回顾下事务的四个特性:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/0D122121475.png" />
我想我这里就不用一一解释了,大家都明白的。我们在数据访问层的设计中是通过引入
“工作单元”来实现事务管理的,工作单元后面会讲述到工作单元内提供的方法及事务性。
最后、数据访问层必须提供处理并发的功能,我们在系统访问的人较多的情况时肯定会出现并发的情况,数据访问层如何处理这样的情况就显得极其重要了,在
一个多用户并发的系统中,通过前面提到的事务来处理,这时候可能就会出现数据库完整性的问题,例如这样的情况,一个用户现在在编辑自己的个人信息,例如将生
日修改为1985年3月20日,这个用户对应的ID是298,这时候他只是修改了,但是还没有提交,此时管理员也修改了,比如说修改了ID为298的这个用户信息的地址或
者其他信息,并且提交,此时,用户将自己编辑的生日提交了,那么数据库中对应的ID为298的数据信息就会是最新修改的数据信息,那么之前管理员修改的数据信息
就会发生丢失,虽然是修改的可能字段不是同一个字段,这就和我们底层实现的数据访问层有关,当然如果说我们在数据访问层实现了,只更新修改过的数据列的值的
话,那么可能不会存在这样的情况,当然这就和我们底层实现的数据访问层的机制有关。
下面我们通过图形的方式来说明,更容易理解:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/28122121395.png" />
我们来看看可能的几种方案,可以对这样的并发做出相应的处理?
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/BE122121744.png" />
当然这里只是提供了几个简单可行的办法,当然如果大家还
有更好的办法,可以告诉我,不胜感激。
当然上面的四个基本职责是我们在数据访问层必须提供的,还应该提供缓存机制,延迟加载等等包括一些性能方面的优化的设计等,这些都在后面讲解吧。
下面我们来看看数据访问层与其他层直接的关系与交互,我们前面说过,在领域模型下,业务逻辑层中的数据的持久化都是通过服务层来完成的,下面我们来看
看各层之间的关系。我们先来看看服务层与数据访问层之间的关系。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/46122121105.png" />
服务层与数据访问层之间进行交互,服务层通过DTO与UI层进行交互,服务层通过组织业务逻辑层中的对象来实
现业务流,然后通过调用数据访问层将业务流中的相应数据进行持久化,通过数据访问层来初始化领域模型。置于直接在表现层中使用数据访问层的功能,我们通常是
不推荐这样做的,一般我们不会这么做的,我这里就不详细的阐述。
五、如何设计数据访问层
本节将详细的讲述如何设计出自己的数据访问层,满足上述的几个基本要求,那么可以说就算完成了基本的数据访问层的功能,其实如果我们从头开始开发一个
这样的数据访问层将是非常大的工作量,目前流行的很多的ORM框架已经提供了丰富的数据访问层的功能,能够非常好的满足上述的几项职责。当然本节还是会结合代
码来说说数据访问层的具体实现。
我们前面讲述了数据访问的3个基本的功能需求,数据库独立性,可配置性及持久化对象模式(对象模型与关系模型的转换),我们这里先看如何实现数据库的独立
性,