polardbxengine/mysql-test/suite/innodb/t/long_deadlock_cycle.test

108 lines
2.8 KiB
Plaintext

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