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 109 110 111 112 113 114 115 116 117
|
# DEBUG_SYNC must be compiled in.
--source include/have_debug_sync.inc
--source include/have_debug.inc
--source include/have_innodb.inc
CREATE TABLE t1 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB;
INSERT INTO t1 VALUES(0, "0");
INSERT INTO t1 VALUES(1, "1");
INSERT INTO t1 VALUES(2, "2");
INSERT INTO t1 VALUES(3, "3");
--connect (con1,localhost,root,,)
--connect (con2,localhost,root,,)
--connect (con3,localhost,root,,)
--connect (con4,localhost,root,,)
--connect (con5,localhost,root,,)
--connect (con6,localhost,root,,)
connection default;
# Disable query log to avoid non-deterministic output conflicts
SET AUTOCOMMIT=0;
BEGIN;
# Lock all the records
SELECT * FROM t1 FOR UPDATE;
--disable_query_log
connection con1;
SET AUTOCOMMIT=1;
# Test if locking autocommit selects end up in the trx_sys_t::trx_list.
# We check this via the INFORMATION_SCHEMA.INNODB_TRX.
# This should block and show up in the I_S.
SET DEBUG_SYNC='lock_wait_start SIGNAL waiting1';
--send
SELECT COUNT(*) FROM t1 LOCK IN SHARE MODE;
connection con2;
SET AUTOCOMMIT=1;
# Test if non-locking autocommit selects end up in the trx_sys_t::trx_list.
# We check this via the INFORMATION_SCHEMA.INNODB_TRX.
# This should not block and should not show up in the I_S.
--send
SELECT COUNT(*) FROM t1;
connection con3;
SET AUTOCOMMIT=1;
# Note: autocommit non-locking selects are not converted to locking selects
# Therefore this should not block;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
--send
SELECT COUNT(*) FROM t1;
connection con4;
SET AUTOCOMMIT=0;
# Note: Non-locking selects are converted to locking selects
# therefore this should block;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET DEBUG_SYNC='now WAIT_FOR waiting1';
SET DEBUG_SYNC='lock_wait_start SIGNAL waiting4';
--send
SELECT COUNT(*) FROM t1 WHERE c1 >= 0;
connection con5;
SET AUTOCOMMIT=1;
# This should not block
BEGIN;
--send
SELECT COUNT(*) FROM t1;
connection con6;
SET AUTOCOMMIT=1;
# This will ignore the auto-commit setting but wont block because it is
# a non-locking select.
XA START '1';
--enable_query_log
SELECT * FROM t1 WHERE c1 <= 3;
connection default;
# Wait for SELECTs to get into the lock wait queue
SET DEBUG_SYNC='now WAIT_FOR waiting4';
SET DEBUG_SYNC= 'RESET';
# Check the number of non-locking transactions
let $wait_condition =
SELECT COUNT(*) = 5
FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE trx_autocommit_non_locking = 0;
--source include/wait_condition.inc
# Check the waiting transactions
SELECT trx_state, trx_query, trx_autocommit_non_locking
FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE trx_state = 'LOCK WAIT'
ORDER BY trx_query;
INSERT INTO t1 VALUES(4, '4');
COMMIT;
connection con6;
SELECT * FROM t1 WHERE c1 <= 4;
XA END '1';
XA PREPARE '1';
XA ROLLBACK '1';
disconnect con6;
disconnect con2;
disconnect con3;
disconnect con5;
connection con1;
reap;
disconnect con1;
connection con4;
reap;
disconnect con4;
connection default;
DROP TABLE t1;
|