デッドロックをシミュレートするコード


26

アプリケーションをテストしています。データベースサイトのデッドロックを安定してシミュレートするコードが必要です(可能であればSQLスクリプト)。

ありがとうございました。

追加:

1つのテーブルのみが関与するデッドロックを再現する


2
質問がよくわかりません。少し言い換えてもらえますか?明らかに、以下の2人はあなたを十分に理解していましたが、私はあなたを完全にフォローしていません。「安定して」デッドロックをシミュレートするコードを意味しますか?デッドロックが発生した後、あなたは何をしますか?それが起こることを証明したいだけですか?
jcolebrand

回答:


29

最良の方法は、すでにあるテーブルを使用することです。table-a、table-bの2つのテーブルを作成します。テストでは、実際のデータに影響を与えないように、同じ列を同じ情報で更新することもできます。

たとえば、UPDATE table_a set ID = ID where ID = 100;

同じデータベースへの2つのセッションを開きます。で、実行

BEGIN TRAN
update table_a set ID=ID where ID = 100;

2回実行

BEGIN TRAN
update table_b set ID=ID where ID =100;

次に、更新ステートメントを対向するセッションにコピーし、同時に実行します。一つに、

update table_b set ID=ID where ID =100;

二人で

update table_a set ID=ID where ID = 100;

私は今これを試してみて、MS-SQLに乗りました

Msg 1205, Level 13, State 56, Line 1
Transaction (Process ID 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

7

sp_getapplockシステムストアドプロシージャを使用して、サンプルコードで必要なロックを取得します。

厳密に言えば、これはダイクストラセマフォです。それでも便利です


sp_getapplockエラーをスローしません。(タイムアウトがない場合)、それはどちらか、リターン期限切れにタイムアウトを待つ、またはます-3msdn.microsoft.com/en-us/library/ms189823.aspxを
イアン・ボイド

2

上記の投稿に似た別の方法があります->

CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT)
CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))

クエリウィンドウ#1で使用されるスクリプト

BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)

クエリウィンドウ#2で使用されるスクリプト

BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)

クエリウィンドウ#1に追加するスクリプト

INSERT dbo.Tbl2 (id, col) VALUES (111, 555)

詳細については、http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.