1

NHibernateを使用してユーザーアクション時にいくつかのテーブルをトランザクションで更新するASP.NETアプリがあります。排他的な日付が指定されるように、テーブル「予約」へのエントリを1つだけ作成できる日付範囲があります。

私の問題は、2つのユーザーアクションがほぼ同時に発生し、1日を超える「予約」に複数のエントリが発生する競合状態を防ぐ方法です。.Commit()を呼び出す直前に確認することはできません。それでも、競合状態のままになると思いますか?

私が見ることができるのは、コミット後にチェックを行い、変更を手動でロールバックすることだけですが、それは私の口に非常に悪い味を残します!:)

Booking_ref(INT)PRIMARY_KEY AUTOINCREMENT

Booking_start(DATETIME)

Booking_end(DATETIME)

4

3 に答える 3

5
  • トランザクションの分離レベルを SERIALIZABLE ( session.BeginTransaction(IsolationLevel.Serializable) にして、同じトランザクションにチェックして挿入します。このような状況では、通常、isolationlevel を serializable に設定しないでください。

また

  • チェックして最終的に挿入する前にテーブルをロックします。これは、nhibernate を介して SQL クエリを実行することで実行できます。

    session.CreateSQLQuery("SELECT null をダミーとして FROM Booking WITH (tablockx, holdlock)").AddScalar("dummy", NHibernateUtil.Int32); これにより、そのトランザクションの間、選択/挿入のためにそのテーブルのみがロックされます。

それが役に立ったことを願っています

于 2008-09-23T10:38:15.863 に答える
-1

データベースは、データの整合性を管理する必要があります。

「日付」列を一意にすることができます。したがって、2 つのスレッドが同じ日付を取得しようとすると、. 1 つは一意のキー違反をスローし、もう 1 つは成功します。

于 2012-12-12T16:19:03.407 に答える