web-dev-qa-db-ja.com

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

アプリケーションをテストしていますが、stableがデータベースサイトのデッドロックをシミュレートするコードが必要です(可能な場合はSQLスクリプト)。

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

ADDED:

1つのテーブルのみを含むデッドロックの再現

25
garik

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

たとえば、UPDATE table_aはID = IDで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.
29
David Hall

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

厳密に言えば、これは Dijkstraセマフォ です。まだ便利なのに

7
mrdenny

上記の方法と同様の別の方法を次に示します->

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/ を参照してください。

2
Ajit Ananthram