How to Simulate deadlock with more than 2 processes in SQL Server test environment? Can someone help me with the code? Just to clarify my question again, I don't want deadlock simulation with only 2 processes. I know how to produce deadlock with 2 processes but am unable to produce it with more than two processes.
If you know how to simulate it with 2, you know how to simulate it with 3, or with N. You have to build a cyclic graph:
- 2 nodes: A->B->A (process A waits on B, process B waits on A)
- 3 nodes: A->B->C->A (process A waits on B, B waits on C, C waits on A)
- N nodes: P1->P2->...Pn->P1
To construct the Px->Py primitive (Process X waits on Process Y) use your favorite blocking mechanism. For example, row locking on a specific key P1->P2->P3->P1:
CREATE TABLE rows (key INT NOT NULL PRIMARY KEY);
1) P1, from session 1:
BEGIN TRANSACTION INSERT INTO rows (key) VALUES (1);
2) P2, from session 2:
BEGIN TRANSACTION INSERT INTO rows (key) VALUES (2);
3) Have P1 wait on P2. From session 1:
SELECT key FROM rows WHERE key = 2;
4) Continue with P3, session 3:
BEGIN TRANSACTION INSERT INTO rows (key) VALUES (3);
5) Add the P2->P3 wait, in session 2:
SELECT key FROM rows WHERE key = 3;
6) To complete the cycle, add the P3->P1 wait, in session 3:
SELECT key FROM rows WHERE key = 1;
As the wait graph created a cycle, the 3 processes are now deadlocked. In a short while the engine deadlock detection mechanism (which periodically walks the wait graphs looking for cycles) detects this cycle and breaks it by choosing a victim and aborting it's transaction then raising error 1205 in the victim session.
To extend to N nodes, repeat steps 4) and 5) as necessary.