私は、ORMとしてNHibernateを使用して小さなASP.NETMVCWebアプリを構築しました。開始するすべてのHTTPリクエストで、セッションを作成し、トランザクションを開いて、リクエストの最後に閉じます。
// Begin request
session = StaticSessionManager.OpenSession();
session.BeginTransaction();
// End of request
currentSession.Transaction.Commit();
currentSession.Flush();
currentSession.Close();
現在、Facebook/Googleログイン用のDotNetOpenAuthAPIも使用しています。新しいユーザーを登録するために、APIはテーブル(たとえばUserProfile)をいくつかのユーザー情報で更新することを期待しています。これはNhibernateのSave()を介して行っています
session.Save(new UserProfile { UserName = userName });
同じWebリクエストで、DotNetOpenAuth APIは、そのテーブル(UserProfile)から上記の挿入されたデータを読み取ることを想定しています。
NHibernateのSaveがデータベースにある種のロックを適用したため、これはデッドロックシナリオにつながります。SQL Server Management Studioを使用してそのテーブルから手動でデータを読み取ろうとしても、Web要求がタイムアウトするまで待機しているようです。
保存後に明示的なフラッシュを試しました
session.Flush();
しかし、これでもロックを解除することはできません。DotNetOpenAUthAPIが最新のデータを読み取れるようにしたいと思います。
現在、保存後にトランザクションを開始し、後でもう一度開きます。これがベストプラクティスであるかどうか/欠点があるかどうかはわかりません。