1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
--source include/have_debug_sync.inc
# A scenario in which we choose the "joining" transaction (the
# one which added the last edge to form the cycle) con1 to be
# the victim
CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY) Engine=InnoDB;
INSERT INTO t1 (id) VALUES (1),(2),(3),(4),(5);
--connect (con1, localhost, root,,)
BEGIN;
SELECT * FROM t1 WHERE id = 1 FOR UPDATE;
--connect (con2, localhost, root,,)
BEGIN;
SELECT * FROM t1 WHERE id = 2 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con2_will_wait';
--send SELECT * FROM t1 WHERE id = 1 FOR UPDATE; ROLLBACK
--connect (con3, localhost, root,,)
BEGIN;
SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait';
SELECT * FROM t1 WHERE id = 3 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con3_will_wait';
--send SELECT * FROM t1 WHERE id = 2 FOR UPDATE; ROLLBACK
--connect (con4, localhost, root,,)
BEGIN;
SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait';
SELECT * FROM t1 WHERE id = 4 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con4_will_wait';
--send SELECT * FROM t1 WHERE id = 3 FOR UPDATE; ROLLBACK
--connection con1
SET DEBUG_SYNC = 'now WAIT_FOR con4_will_wait';
--error ER_LOCK_DEADLOCK
SELECT * FROM t1 WHERE id = 4 FOR UPDATE;
--connection con2
--reap
--connection con3
--reap
--connection con4
--reap
--source suite/innodb/include/show_last_deadlock.inc
# A scenario in which we choose the transaction waiting for our
# "joining" transaction, which is con2.
CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY) Engine=InnoDB;
INSERT INTO t2 (id) VALUES (1),(2),(3),(4),(5);
--connection con1
BEGIN;
# Make con1 "heavy" so it is not chosen as victim
SELECT * FROM t2 FOR UPDATE;
SELECT * FROM t1 WHERE id = 1 FOR UPDATE;
--connection con2
BEGIN;
SELECT * FROM t1 WHERE id = 2 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con2_will_wait';
--send SELECT * FROM t1 WHERE id = 1 FOR UPDATE; ROLLBACK
--connection con3
BEGIN;
SET DEBUG_SYNC = 'now WAIT_FOR con2_will_wait';
SELECT * FROM t1 WHERE id = 3 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con3_will_wait';
--send SELECT * FROM t1 WHERE id = 2 FOR UPDATE; ROLLBACK
--connection con4
BEGIN;
SET DEBUG_SYNC = 'now WAIT_FOR con3_will_wait';
SELECT * FROM t1 WHERE id = 4 FOR UPDATE;
SET DEBUG_SYNC = 'lock_wait_will_wait SIGNAL con4_will_wait';
--send SELECT * FROM t1 WHERE id = 3 FOR UPDATE; ROLLBACK
--connection con1
SET DEBUG_SYNC = 'now WAIT_FOR con4_will_wait';
SELECT * FROM t1 WHERE id = 4 FOR UPDATE;
ROLLBACK;
--connection con2
--error ER_LOCK_DEADLOCK
--reap
--connection con3
--reap
--connection con4
--reap
--source suite/innodb/include/show_last_deadlock.inc
--connection default
--disconnect con1
--disconnect con2
--disconnect con3
--disconnect con4
DROP TABLE t2;
DROP TABLE t1;
|