diff options
Diffstat (limited to 'mysql-test/suite/innodb/t/deadlock_detect.test')
-rw-r--r-- | mysql-test/suite/innodb/t/deadlock_detect.test | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb/t/deadlock_detect.test b/mysql-test/suite/innodb/t/deadlock_detect.test new file mode 100644 index 00000000..e8537907 --- /dev/null +++ b/mysql-test/suite/innodb/t/deadlock_detect.test @@ -0,0 +1,79 @@ +# +# 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 |