DEADLOCK Tracing
Use the DEADLOCK component to trace the occurrences of deadlocks for all applications.
Table 2-3 describes the DEADLOCK tracing levels. Each level with a '+' sign includes the trace information described for that level, plus all levels preceding it.
Table 2-3 DEADLOCK tracing levels
| Level | Output |
|---|---|
|
1 |
Deadlock cycles, logged as they are discovered |
|
4, 6 |
+ Detailed information about how the deadlock is detected |
In this example, execute ttTraceMon to do a DEADLOCK trace at level 1, which is the default, on myDSN database.
Make two connections to myDSN. For the first connection, autocommit is on. Create table test and insert two rows. Then, set autocommit off and update the x1=1 row of table test. Because autocommit is off, the row is not inserted into the table until the commit. A lock is held until the transaction is committed or rolled back.
Command> create table test (x1 int unique, y1 int); Command> insert into test values (1,1); 1 row inserted. Command> insert into test values (2,2); 1 row inserted. Command> autocommit 0; Command> update test set y1=y1 where x1=1; 1 row updated.
For the second connection to myDSN, autocommit is set to off. Update the x1=2 row of table test.
Command> autocommit 0; Command> update test set y1=y1 where x1=2;1 row updated.
Now, create a deadlock situation by executing update statements in both connections for rows that are locked by each other. The first connection executes an update against the row where x1=2.
Command> update test set y1=y1 where x1=2; 6003: Lock request denied because of time-out Details: Tran 2.1 (pid 32750) wants Un lock on rowid BMUFVUAAAAaAAAAETk, table ME.TEST. But tran 3.2 (pid 32731) has it in Xn (request was Xn). Holder SQL (update t1 set y1=y1 where x1=2) The command failed.
The second connection executes an update against the row where x1=1.
Command> update test set y1=y1 where x1=1; 6002: Lock request denied because of deadlock Details: Tran 3.2 (pid 32731) wants Un lock on rowid BMUFVUAAAAaAAAADzk, table ME.TEST. But tran 2.1 (pid 32750) has it in Xn (request was Xn). Holder SQL (update t1 set y1=y1 where x1=1) The command failed.
Use the flush command to empty the buffer.
% ttTraceMon myDSN Trace monitor; empty line to exit Trace> flush
The trace buffer contains the following information showing all level 1 deadlock traces, as evidenced by '1L'.
Trace> dump 09:50:26.444 13 DEADLOCK 1L 2036C 3484P edge 1: xid 3.2, cid 3, <Row BMUFVUAAAAaAAAADzk,0x8c5 74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=1' 09:50:26.455 14 DEADLOCK 1L 2036C 3484P edge 0: xid 2.1, cid 2, <Row BMUFVUAAAAaAAAAETk,0x8c5 74(574836)> 0 cnt=1 , Tbl 'T1', SQL='update t1 set y1=y1 where x1=2' 09:50:26.455 15 DEADLOCK 1L 2036C 3484P Victim: xcb:3.2, SQL='update t1 set y1=y1 where x1=1'
If you want more information, set DEADLOCK tracing to a higher value. For example, the following sets DEADLOCK tracing to level 4 in ttTraceMon:
Trace > level deadlock 4