での線に沿って何か行うアプリケーションを検討し、「挿入はないに存在する」:NHibernateの
var user = session.QueryOver<User>().Where(x => x.Name==name).SingleOrDefault();
if (user == null)
{
user = new User(name);
session.Save(user);
}
ビジネス・ルールは、ユーザーの名前は一意である必要があることを、これは中UNIQUE INDEX
によって支えられていますデータベース。上記のコードはうまくいきます.2人のユーザーが同じ名前で同時に登録しようとするまでは、user == null
となり、新しいUser
を作成してください。コミットする最初のものが成功し、2番目のものが失敗し、データベースから例外が発生します。
このような競合状態を回避する1つの方法は、lock { }
ブロックにクリティカルコードをラップすることですが、アプリケーションの複数のインスタンスが同じデータベースに対して機能する場合は役に立ちません。さて、もし私がRDBS(この場合はMS SQL)のロック機構を使用できるのであれば...
これは私が立ち往生したところです。私がNHibernateのドキュメントで読むことができるものから、明示的なロックを要求する私のQueryOver()
チェーンにいくつかのヒントを追加することで解決できるかもしれません。私はまだ実際の行がないので、これはテーブルロックでなければなりません。これは可能ですか?方法
また、トランザクションの分離レベルを上げて、必要なロックを自動的に獲得できますか?同じ作業単位内で他の(問題ではない)照会が行われていることを考慮すると、この種の変更がブロック/待機をたくさん導入する可能性があると私は考えています。そうですか?
[NHibernateのトランザクションと競合状態](http://stackoverflow.com/questions/119762/nhibernate-transaction-and-race-condition) –