2009-04-06 11 views
2

私たちは、SQL 2005サーバーに接続し、それに多数の挿入/更新と選択を行うためにADO.NETを使用しています。更新の1つをトランザクション内に変更しましたが、トランザクションで設定したIsolationLevelに関係なく、(b)テーブル全体をロックするように見えます。SQLトランザクション(b)ロックの選択 - 私の理解は正しい

私が見ているように見える行動はということです:あなたは何のトランザクションを持っていない場合は、いくつかの取引を持っている場合は

  1. が、それはすべてのアウトの戦い(敗者死んでロックされた取得)
  2. が、その後、彼らはすべての勝利です他のすべてのものを除いてブロックしないでください。
  3. もしあなたがいくつかのトランザクションを持っていて、残りの部分にnolockのようなものを設定すれば、トランザクションと何もブロックされません。 トランザクション()に関係なく、すべてのステートメント(選択/挿入/削除/更新)に隔離レベルがあるためです。

これは正しいですか?

答えて

2

あなたの質問に対する答えは次のとおりです。

あなたがテーブルを更新する場合は、SQL Serverは、行レベルのロック、ページロックまたはテーブル全体のロックをロックする行数を決定するいくつかの戦略を使用しています。

あなたはテーブルの一定割合以上を更新する場合は、(私が覚えているよう設定可能)、その後、SQL Serverは、あなたの選択をブロックすることがあり、テーブルレベルのロックを与えます。

最高の参照は次のとおりです。

幸運。

1

更新ステートメント(つまり、データを変更するステートメント)は、分離レベルと、明示的にトランザクションを定義していないかどうかにかかわらず、ロックを保持します。あなたがコントロールすることができますどのような

query hintsを使用して、ロックの粒度あります。したがって、更新によって表全体がロックされている場合は、影響を受ける行(ROWLOCKヒント)のみをロックする問合せヒントを指定できます。これは、クエリがコース全体のテーブルを更新している場合を除きます。

だからあなたの質問に答えるために、リソースへのリクエストのロックへの最初の接続は、トランザクションの間、これらのロックを保持します。 selectは、コミットされていない読み取りレベルを使用してロックを保持せず、データの挿入/更新/削除を変更するステートメントは常にロックを保持しないように指定できます。同じリソース上のロックを要求する次の接続は、最初の接続が完了するまで待機し、ロックを保持します。デッドロックは、2つの接続がロックを保持し、それぞれが他の接続のリソースを待っている特定のシナリオです。エンジンが永久に待機するのを避けるために、1つの接続がデッドロック犠牲者として選択されます。

関連する問題