我在Web應用程序中以有意義的方式實現NHibernate中的optimisitc併發時遇到問題。下面是不同的場景:NHibernate中會話中的樂觀併發性
- 用戶A打開一個表單來編輯記錄
- 用戶B打開同一表單編輯同一記錄
- 用戶A可以節省他們的數據
- 用戶B試圖保存他們的數據,但得到數據已更新的警告。
一種常見的情況。這裏是更新代碼和實體映射文件:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Entities" assembly="Domain">
<class name="Record" />
<id name="Id" column="Id" type="long">
<generator class="identity"/>
</id>
<version name="Version" column="Version" type="datetime" />
<property name="Description" column="`Description`" type="string" />
</class>
</hibernate-mapping>
public void Edit(int id, string description, DateTime version)
{
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
var record = session.Get<Record>(id);
record.Version = version;
record.Description = description;
session.Update(record);
tx.Commit();
}
}
當用戶打開形式,並且被存儲在隱藏字段中的版本值被加載。我希望NHibernate會嘗試使用WHERE子句中的表單來更新版本,但是它會使用它剛剛在會話中加載的值。
我讀過的其他東西告訴我,我應該手工比較值,並且(例如)如果加載新版本時拋出異常。但我不相信有更好的辦法。
在我看來,NHibernate的併發控制只在同一個會話中有用,因此當涉及基於Web的應用程序的陳舊錶單數據時完全沒有用處。
我希望能夠根據用戶最初加載時的形式手動設置版本。這可能嗎?或者我在這裏錯過了什麼?