Kilitlenme simülasyonu kodu


26

Uygulamamı test ediyorum Veritabanındaki çıkmaz kilitlenmeyi sağlayan kararlı bir koda ihtiyacım var (mümkünse sql betiği).

Teşekkür ederim.

KATMA:

Yalnızca bir tablo içeren kilitlenmeleri çoğaltma


2
Soruyu tam olarak anlamadım. Biraz reword edebilir misin? Açıkçası, aşağıdaki iki kişi seni yeterince iyi anladı, ama seni tam olarak takip etmiyorum. "Kararlı" bir kilitlenme simüle eden kod mu demek istiyorsun? Bir kilitlenme yaşandıktan sonra ne yapacaksınız? Sadece bunun olabileceğini kanıtlamak ister misin?
jcolebrand

Yanıtlar:


29

En iyi yol, sahip olduğunuz tabloları kullanmak olacaktır. İki tablo oluşturun - tablo-a, tablo-b Bir test için aynı sütunu aynı bilgilerle güncelleyebilirsiniz, böylece gerçek verileri etkilemezsiniz.

Örneğin UPDATE table_a, ID = ID'yi ayarlar; burada ID = 100;

Aynı veritabanına iki oturum açın. Birinde koş

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

İki kaçak

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

Ardından, güncelleme bildirimlerini rakip oturumlara kopyalayın ve aynı anda çalıştırın. Birinde,

update table_b set ID=ID where ID =100;

İkiye

update table_a set ID=ID where ID = 100;

Bunu şimdi denedim ve MS-SQL'e başladım.

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.


2

İşte yukarıda belirtilene benzer başka bir yöntem ->

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

Sorgu Penceresinde kullanılacak komut dosyası

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

Sorgu Penceresinde kullanılacak komut dosyası # 2

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

Sorgu Penceresi'ne eklenecek komut dosyası # 1

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

Bununla ilgili daha fazla ayrıntı için http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/ adresine bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.