0

なぜこれが起こっているのか、頭を丸めるのに問題があります。私は理論を理解していると確信していますが、私には見えない何かが起こっているに違いありません。

表Aのスキーマは次のとおりです。

ID [Primary Key]
Name
Type [Foreign Key]

SprocAは、分離レベルを反復可能読み取りに設定し、テーブルAから。を持つ行を選択しますType=1。また、これらの行を更新します。

SprocBは、テーブルAから。を持つ行を選択しますType=2

これらは完全に異なる行セットであるため、両方を同時に実行すると(そして、WAITFOR速度を落とすために呼び出しを行うと)、SprocBはSprocAまで完了しません。

プライマリIDに基づいて選択した場合と同様に、タイプのクエリに関係していることはわかっています。これにより、テーブルへの同時アクセスが可能になります。

誰かが光を当てますか?

乾杯

4

3 に答える 3

1

SQL Serverはインデックスを使用して範囲ロックを行います(これは繰り返し可能な読み取りがよく使用されるものです)。そのため、タイプにインデックスがない場合、おそらくテーブル全体をロックします...

于 2009-11-04T18:55:05.873 に答える
1

分離レベルに Repeatable Read を設定すると、トランザクションが完了するまで、読み取ったすべてのデータに対して共有ロックが保持されます。それは、COMMIT または ROLLBACK までです。

これにより、アプリケーションがこのデータにアクセスする際の同時実行性が低下します。したがって、最初のプロシージャがテーブルから SELECTS し、WAITFOR を呼び出してから再度 SELECTS をトランザクション内で呼び出すと、トランザクションをコミットするかプロセスが完了するまで、共有ロックをずっと保持します。

これが作業中のテスト プロシージャである場合は、各選択の後に COMMIT を追加して、2 番目のプロシージャを同時に実行するのに役立つかどうかを確認してください。

幸運を!

ケビン

于 2009-11-04T19:09:36.057 に答える