SQLServer
目的
意図的にデッドロックを発生させる
手順
1.テーブルを作成
.sql
CREATE TABLE Table1 (
ID INT PRIMARY KEY IDENTITY,
Name VARCHAR(50)
);
2.データ投入
.sql
@echo off
sqlcmd -S localhost -d sampleDB -U sa -P sample -Q "INSERT INTO Table1 (ID, Name) VALUES ('John');"
sqlcmd -S localhost -d sampleDB -U sa -P sample -Q "INSERT INTO Table1 (ID, Name) VALUES ('Alice');"
3.1→2の順にSELECT
ポイント
- ID2を参照後 10秒待機
.sql
BEGIN TRAN
SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 1
WAITFOR DELAY '00:00:10'
SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 2
ROLLBACK
4.2→1の順にSELECT
ポイント
3.で10秒待機している間に実行
.sql
BEGIN TRAN
SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 2
WAITFOR DELAY '00:00:10'
SELECT TOP(1) *
FROM Table1 WITH(ROWLOCK, UPDLOCK)
WHERE
ID = 1
ROLLBACK