Kode untuk mensimulasikan kebuntuan

26

Saya menguji aplikasi saya, saya memerlukan beberapa kode yang stabil mensimulasikan kebuntuan di situs database (skrip sql jika mungkin).

Terima kasih.

TAMBAH:

Kebuntuan mereproduksi hanya melibatkan satu meja

garik
sumber
2
Saya tidak begitu mengerti pertanyaannya. Bisakah Anda menulis ulang sedikit? Jelas kedua orang di bawah ini memahami Anda dengan cukup baik, tetapi saya tidak cukup mengikuti Anda. Apakah maksud Anda kode yang "stabil" mensimulasikan kebuntuan? Apa yang akan Anda lakukan setelah ada jalan buntu? Apakah Anda hanya ingin membuktikan bahwa itu bisa terjadi?
jcolebrand

Jawaban:

29

Cara terbaik adalah menggunakan tabel yang sudah Anda miliki. Buat dua tabel - table-a, table-b Untuk tes Anda bahkan dapat memperbarui kolom yang sama dengan informasi yang sama sehingga Anda tidak mempengaruhi data nyata.

Misalnya UPDATE table_a set ID = ID di mana ID = 100;

Buka dua sesi ke database yang sama. Pada satu, jalankan

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

Di jalankan dua

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

Kemudian, salin pernyataan pembaruan ke sesi yang berlawanan dan jalankan pada saat yang sama. Jadi satu,

update table_b set ID=ID where ID =100;

Dalam dua

update table_a set ID=ID where ID = 100;

Saya baru saja mencoba ini dan menggunakan 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.
David Hall
sumber
7

Gunakan sp_getapplockprosedur yang tersimpan sistem untuk mengambil apa yang perlu kunci pada kode sampel Anda.

Sebenarnya, ini adalah semafor Dijkstra . Masih sangat berguna

mrdenny
sumber
sp_getapplocktidak akan melempar kesalahan. Entah akan menunggu batas waktu berakhir, atau (jika tidak ada batas waktu), kembali -3( msdn.microsoft.com/en-us/library/ms189823.aspx )
Ian Boyd
2

Berikut metode lain yang mirip dengan yang diposting di atas ->

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))

Script yang akan digunakan di Query Window # 1

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

Script yang akan digunakan di Query Window # 2

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

Script yang akan ditambahkan ke Jendela Permintaan # 1

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

Untuk detail tambahan tentang ini, lihat http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

Ajit Ananthram
sumber