# # wl#9383 INNODB: ADD AN OPTION TO TURN OFF/ON DEADLOCK CHECKER # --source include/have_innodb.inc --source include/count_sessions.inc let $have_deadlock=`select @@GLOBAL.innodb_deadlock_detect`; connection default; CREATE TABLE t1( id INT, PRIMARY KEY(id) ) ENGINE=InnoDB; INSERT INTO t1 VALUES(1), (2), (3); # We are not interested query results, only errors --disable_result_log BEGIN; SELECT * FROM t1 WHERE id = 1 LOCK IN SHARE MODE; connect (con1,localhost,root,,); BEGIN; SELECT * FROM t1 WHERE id = 2 LOCK IN SHARE MODE; connect (con2,localhost,root,,); BEGIN; SELECT * FROM t1 WHERE id = 2 LOCK IN SHARE MODE; send SELECT * FROM t1 WHERE id = 1 FOR UPDATE; connection default; send SELECT * FROM t1 WHERE id = 2 FOR UPDATE; connection con2; if (!$have_deadlock) { --error ER_LOCK_WAIT_TIMEOUT reap; disconnect con1; } if ($have_deadlock) { connection con1; COMMIT; disconnect con1; connection con2; --error 0,ER_LOCK_DEADLOCK,ER_LOCK_WAIT_TIMEOUT reap; } ROLLBACK; disconnect con2; # # Note here that con1 is the older transaction as it # query started wait first. Thus, con1 gets lock # wait timeout first. There is possibility that # default connection gets lock timeout also or # as con1 is rolled back it gets the locks it waited # and does the update. # connection default; if (!$have_deadlock) { --error 0,ER_LOCK_WAIT_TIMEOUT reap; } if ($have_deadlock) { --error 0,ER_LOCK_DEADLOCK reap; } ROLLBACK; --enable_result_log DROP TABLE t1; --source include/wait_until_count_sessions.inc