ฉันกำลังทดสอบแอปพลิเคชันของฉันฉันต้องการรหัสบางอย่างที่เสถียรจำลองการหยุดชะงักบนเว็บไซต์ฐานข้อมูล (สคริปต์ sql ถ้าเป็นไปได้)
ขอขอบคุณ.
เพิ่ม:
ฉันกำลังทดสอบแอปพลิเคชันของฉันฉันต้องการรหัสบางอย่างที่เสถียรจำลองการหยุดชะงักบนเว็บไซต์ฐานข้อมูล (สคริปต์ sql ถ้าเป็นไปได้)
ขอขอบคุณ.
เพิ่ม:
คำตอบ:
วิธีที่ดีที่สุดคือการใช้ตารางที่คุณมีอยู่แล้ว สร้างสองตาราง - table-a, table-b สำหรับการทดสอบคุณสามารถอัปเดตคอลัมน์เดียวกันด้วยข้อมูลเดียวกันดังนั้นคุณจะไม่ส่งผลกระทบต่อข้อมูลจริงใด ๆ
เช่น UPDATE table_a ตั้งค่า ID = ID โดยที่ ID = 100;
เปิดสองเซสชันไปยังฐานข้อมูลเดียวกัน ในหนึ่งวิ่ง
BEGIN TRAN
update table_a set ID=ID where ID = 100;
เมื่อสองวิ่ง
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.
ใช้sp_getapplock
ขั้นตอนการจัดเก็บระบบเพื่อทำสิ่งที่เคยล็อคต้องในรหัสตัวอย่างของคุณ
พูดอย่างเคร่งครัดนี้เป็นสัญญาณ Dijkstra ยังคงมีประโยชน์แช่ง
sp_getapplock
จะไม่ผิดพลาด มันจะรอให้หมดเวลาหมดอายุหรือ (หากไม่มีการหมดเวลา) ให้ส่งคืน-3
( msdn.microsoft.com/en-us/library/ms189823.aspx )
นี่คือวิธีอื่นที่คล้ายกับวิธีการโพสต์ด้านบน ->
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))
สคริปต์ที่จะใช้ใน Query Window # 1
BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)
สคริปต์ที่จะใช้ใน Query Window # 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/