nHibernate で競合状態が発生し、データベースに重複したエントリが作成されています。残念ながら、UNIQUE
データベースにインデックスを作成できないため、nHibernate メソッドのみを使用してこのエラーを解決したいと考えています。これは、Web ファームで実行される可能性のある Web アプリケーションです (したがって、システム ロックでも問題は解決しないはずです)。簡略化した状況は次のとおりです。
var current = UnitOfWorkManager.Instance.Current;
current.BeginTransaction(IsolationLevel.Serializable);
try {
var myEntity = MyFactory.MyEntityRepository.GetBy(product, company);
// race condition happens between the previous statement and Save() method.
if (myEntity == null)
{
myEntity = new MyEntity();
myEntity.Product = product;
myEntity.Company = company;
myEntity.Date = date;
myEntity.CurrentUser = currentUser;
myEntity.IsManual = true;
myEntity.Save();
}
else
{
myEntity.IsManual = false;
myEntity.Save();
}
current.CommitTransaction();
}
catch {
current.RollbackTransaction();
throw;
}
私は nHibernate を初めて使用するので、ここでいくつかの基本が欠けている可能性があります。フィードバックをいただければ幸いです。:)