处理版本和并发问题:
1.修改entity的基本类型,添加一个版本字段
protected virtualint Version { get; set; }
2.在product映射文件中,添加version元素
<natural-id mutable="true">
<property name="Name"not-null="true" />
</natural-id>
<version name="Version" />
<property name="Description" />
<property name="UnitPrice" not-null="true" />
3.ActorRole的映射文件也添加一个版本元素:
<id name="Id">
<generator class="guid.comb"/>
</id>
<version name="Version" />
<property name="Actor" not-null="true" />
<property name="Role" not-null="true" />
4.考虑到这种情况,2个用户同时从数据库中取得数据,第一个修改了提交,过了一会第2个修改提交,就覆盖了第一个的修改。处理这种并发的问题有2种方式:
乐观并发:第2 个用户提交,会检查这个version,不对就会抛出异常。version这个版本的变化,会在每次跟新数据的时候自动增加
参见这条sql语句:
UPDATE Product
SET Version = 2 /* @p0 */,
Name = 'Junk' /* @p1 */,
Description = 'Cool' /* @p2 */,
UnitPrice = 100 /* @p3 */
WHERE Id = '764de11e-1fd0-491e-8158-9db8015f9be5'/* @p4 */
AND Version = 1 /* @p5 */
悲观并发:锁机制,一旦一个用户取得数据,获得一个独占锁,这个要通过NH的事务 session.Lock方法来做
其他的一些乐观并发处理:
<class name="Product" dynamic-update="true" optimistic-lock="dirty">