我想使用nHibernate 3使用UnitOfWork模式來實現併發檢查。nHibernate和併發檢查
爲了更精確:
- 打開新的會話的會話,會話中的
- 負荷實體,
- 關閉會話,
- 給予用戶一些時間加載實體編輯數據,
- 打開新的會話,
- 更新數據
- close session。
我正在使用timestap版本實體。
這裏是我的映射文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="...."
namespace="...."
default-lazy="false">
<class name="Employee"
optimistic-lock="version"
dynamic-update="true">
<id name="Id">
<generator class="native" />
</id>
<version column="LastEditDate" generated="always" type="timestamp" />
<property name="Name" not-null="1" length="255" />
<property name="LastEditUser" not-null="1" length="255"/>
</class>
</hibernate-mapping>
我不知道如何在會話的上下文更新實體
var entity = <updated by user>
using (var session = GetNewSession())
{
//todo: load current version value/attach entity to context
session.SaveOrUpdate(entity);
//if concurency check fails, StaleObjectException (or similar) is expected to be thrown
}
在SQL應該像這樣工作
UPDATE ENTITY SET LastEditDate = @P1, ... WHERE ID = @P2 AND LastEditDate = @P3
where:
@P1 - new LastEditDate
@P2 - entity ID
@P3 - previous LastEditDate
如果ROWSMODIFIED = 1則更新成功,否則如果= 0,則併發異常
使用Linq2Sql非常簡單:創建版本控制列,將實體附加到新的會話上下文並嘗試更新。
我該怎麼做nHiberate?它是否支持?
我正在使用樂觀鎖定。我可能是錯的,但session.Lock看起來像是悲觀的鎖定場景。 – tomo 2011-03-26 10:52:16
爲了將實體保存在另一個會話中,您需要將實體鎖定到較新的會話。 – 2011-03-26 10:59:26