型,当然我们还可以更灵活,我们通过在事务单元中设置属性判定是否在事务中,如果不在事务中,我们执行数据持久化操作,如果在事务中,我们则添加到事务列表
中,因为我们在提交时总会循环执行事务列表中的事务单元。当然我这里只是一个简单的思路,抛砖引玉,希望大家有更好的想法,可以跟我交流,或者给我提出建
议,那样我就感激不尽了。下面我们来看看数据访问层中的并发的问题,我们如何去应对,有没有什么完美的方案呢?
前面我们举例子说过,有3中方式,我们这里举例说明:
通过字典存储值发生变化的列,完成更新变化列的操作。这样至少可以避免2人同时更新,造成最近更新的内容覆盖先前更新的内容,虽然可能更新的是不同的数
据列,我们这里只提供实例代码:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/47122121543.png" />
另外2种实现方式也差不多,一种是在数据库表中添加一列版本号,然后在数据更新时必须加上之前取出来的对象的版本号,然后一并同主键作为条件,完成更
新,这样至少可以保证数据的完整性。另外一直就是通过对象代理,我们将要更新的对象的字段的旧值,放在代理中,然后在生成更新语句时,我们将对象代理中的旧
值也添加到where查询条件中,这样我们通过限制条件的方式,来维护数据的完整性。我们来看看简单代码:
- public class EntityProxy
- {
- public string Name
- {
- get;
- set;
- }
- public object Tag
- {
- get;
- set;
- }
- public int ID
- {
- get;
- set;
- }
- public string Unit
- {
- get;
- set;
- }
- }
假设上面的几个数据列是我们要更新的数据库列,那么我们只需要在UPdate语句中,附加这四个数据库列字段条件就好了,这样如果发现更新结果返回的是0,那
么代表更新失败。通过上面的几种形式,我们来看,如果允许的话,我们还是推荐在数据库表中添加一个版本号的形式来处理更新,这是最高效的形式,可以通过时间
戳的形式来生成版本号。
七、本章总结
本章主要简单阐述了,数据访问层的基本功能,必要的四个职责,及数据库访问层的简单的设计思路与实现思路,当然我这里没有提供完整的实现,具体的实
现,我想我会在ORM系列中提供完整的代码,当然目前可能必须讲完架构后,回头我会拾起来那部分进行详细的讲解,好了我想本文的内容都比较浅显易懂,大家都能
够迅速的掌握,如果您有更好的思路或者设计方案,那么很希望您能提出来交流,这将是我莫大的荣幸。
作者:CallHot-何戈洲
出处:http://www.cnblogs.com/hegezhou_hot/
关于作者:专注于微软平台项目架构、管理和企业解决方案。熟悉设计模式、极限编程、架构设计、敏捷开发和项目管理。现主要从事WinForm、ASP.NET、等方面的项目开发、架构、管理工作。如有问题或建议,请多多赐教!