对于web和企业来说,跨用户交互过程的数据事务是不可接受的。单一的应用事务中可能会跨多个数据库事务。如果这些数据库事务只有一个(最后一个)进行了更新数据,其他的只是简单的读数据,则这个应用事务就是原子性的。如果出现多个用户同时写入了一条数据,最后结果是不确定的。如果多个用户删除了同一条数据,就会异常终止数据。并发控制有2种方式:悲观并发控制和乐观并发控制。NHibernate使用的是乐观并发控制。
一。悲观并发控制
悲观并发控制是基于控制锁的并发控制。在对一条数据的所有用户之前,添加一把并发锁。在一个用户更新一条记录之间,添加一把排他锁,其他用户要修改此条记录必须等待,只有在前一个用户更新记录之后,或主动释放锁,这个锁才解开,其他用户才可以重新获取锁,更新这条记录。
因为读者与写着堵塞,写着与写着堵塞,所以可能出现数据争用的情况,效率也比较低。
二。乐观并发控制。
乐观并发控制是基于版本号或时间戳的并发控制。对所有需要进行并发控制的数据添加一个版本号或时间戳的字段或属性。当发生争用冲突时,会检查数据版本是否是最新,如果不是最新,则回滚当前用户对数据的写操作。NHibernate默认使用乐观并发控制,给所有持久化对象添加了一个‘程序看不见’的版本控制(Version)属性,通过持久化对象的版本进行并发控制(我们可以手动在xml中添加version节点,观察version是怎么控制并发的)。
以version为例,在配置文件中添加:
<version name="属性名" column="列名" type=".Net数据类型" unsaved-value="对象临时态时主键值"/>
- name为必填属性
- colonm名称如果和属性名相同时可以省略
- type类型是.Net基本类型时可以省略
- type类型是.Net基本数据类型时,NHibernate能够自动推断主键属性默认值,因此可以省略unsaved-value
- timestamp是可以理解为不够强的版本控制,以对象的最后更新的时间戳为当前最新版本。