2

私はこれを理解することができません.私は自分の問題を盲目的に見つめていると思います.

Msql サーバー 2012 で次のシナリオがあります。

10 スレッド (C# + NHibernate) では、次のようにします。

  1. トランザクションの開始 (ReadCommitted)
    1. Select count(*) from MyTable1 where ... (インデックスを持たない列で比較するため、おそらく完全なテーブル スキャンが発生します)
    2. MyTable1 に挿入...
    3. MyTable2 に挿入...
    4. a、b、c を 100 回繰り返します。
  2. トランザクションをコミットする

使用されるデータはスレッドごとに固有であるため、あるスレッドが別のスレッドと同じ挿入を作成することはできません。

これにより、デッドロックが発生します。

ReadUncommittedトランザクションを使用すると、読み取り/書き込みロックがまったくないため、問題なく動作します。

しかし、これがどのようにデッドロックを引き起こす可能性があるかについて頭を悩ませているようには見えず、これがデッドロックの教科書的な例であると確信しています。

これがどのようにデッドロックを引き起こす可能性があるかを誰かが明確にすることはできますか?

4

2 に答える 2

1

次のように考えてください。

  • スレッド (a) はステップ 1.1 を実行します (Read MyTable1)
  • スレッド (b) はステップ 1.1 を実行します (Read MyTable1)
  • スレッド (a) は、ステップ 1.2 (Write MyTable1) を実行します。
  • スレッド (b) は、ステップ 1.2 (Write MyTable1) を実行します。

次の繰り返し...

  • スレッド (a) は、スレッド (b) がコミットするまで待機する必要があるため、ステップ 1.1 を実行しようとします。
  • スレッド (b) は、スレッド (a) がコミットするまで待機する必要があるため、ステップ 1.1 を実行しようとします。

デッドロック

于 2013-02-05T22:50:00.800 に答える
0

データベースがSnapshotReadComitted用に構成されていることがわかります。しかし、私は知りませんでした(システムのニービー)。

これに気づいたらすぐに問題を解決することができました:)。

すべてのあなたの助けのためのThx:)。

于 2013-03-03T16:14:33.163 に答える