2012-01-23 36 views
0

マルチスレッドアプリケーションでtablockxにデッドロックが発生する理由を理解するためには助けが必要です。なぜTABLOCKXにデッドロックがないのですか

は、私はあなたが行レベルのロックを使用するときにデッドロックはかなりだけまだ私は任意のデッドロック

答えて

2

を取得しておりません複数のスレッドを発生する可能性がありますのでSqlQueryStressでTABLOCKXてみました。デッドロックの最も基本的な例である:

  • トランザクションAが更新行1,2,3
  • トランザクションBが更新される行3,2,1
  • Aが行1を修正され、開く(ロック)行2、行3つの
  • Bロック列3、行2

待つ待つA 2を有し、3が必要であり、Bは3を有し、2を必要とし、彼らはクエリない限り永久に待機するためエンジンがキャッチし、デッドロックが発生します。基本的に、それはキャンセルされる待ちの無限論理ループです。

TABLOCKを使用すると、行ロックの代わりにテーブルロックを使用することがエンジンによって示されます。トランザクションAは、Bが既に開いている場合はテーブル全体が使用可能になるのを待つか、テーブル全体が使用可能な場合はテーブル全体が終了し、他のトランザクションが完了するまでテーブルを変更できなくなります。

+0

私たちがtablockxを実行すると、SQL Serverはテーブルにロックを適用しますが、たとえば、別のトランザクションが同じリソースでtablockxを取得しようとすると、トランザクションは待機する必要がありますが、SQL Serverが処理またはスローするときこのリソースが排他的テーブルロックを既に獲得している、他のトランザクションへの結果デッドロック – stackflow532

+0

最初にデッドロックを回避するために 'TABLOCK'を使用している場合、待ち時間が長すぎるとデッドロックエラーが発生するのはなぜですか?また、投稿された質問とは関係ありません。機能リクエストがある場合は、Microsoft Connectに投稿してください。 – JNK

+0

あなたが誤解して申し訳ありませんが、私はデッドロックエラーを投げるものではありません。ただロックを獲得するprioryトランザクションがロックを解除する限り、別のトランザクションがどれくらい待つかを知りたいだけです。 – stackflow532

関連する問題