mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
082898f9aa
The test is supposed to provoke a deadlock, to test a crash of the server in some deadlock scenarios. The problem is that in recent version of MySQL, no deadlock occurs. It is not clear why a deadlock should be expected. One transaction does an insert+delete on primary key value 1 in table t2. The other transaction does an insert on primary key value 123. There seems no reason that these should conflict, so there is no deadlock. (Presumably an earlier version did get a deadlock due to maybe taking excessive locks on the insert+delete of primary key value 1. The table has only one row, so maybe a different locking was used ("Impossible WHERE noticed after reading const tables")) Fix is to have transaction 1 lock PK 1 and transaction 2 lock PK 123. Then have transaction 2 access PK 1 (wait) and transaction 1 access PK 123 (deadlock). It has been checked that this modified test case still crashes the server in the same way prior to fix of the original bug (Bug#24989). mysql-test/include/read_many_rows.inc: Provoke deadlock on same PK value in the two transactions to ensure that the deadlock does occur independently on whatever execution plan is chosen. mysql-test/r/read_many_rows_innodb.result: Result file update.
101 lines
2.8 KiB
Text
101 lines
2.8 KiB
Text
SET SESSION STORAGE_ENGINE = InnoDB;
|
|
DROP TABLE IF EXISTS t1, t2, t3, t4;
|
|
CREATE TABLE t1 (id INTEGER) ENGINE=MyISAM;
|
|
CREATE TABLE t2 (id INTEGER PRIMARY KEY);
|
|
CREATE TABLE t3 (a CHAR(32) PRIMARY KEY,id INTEGER);
|
|
CREATE TABLE t4 (a CHAR(32) PRIMARY KEY,id INTEGER) ENGINE=MyISAM;
|
|
INSERT INTO t1 (id) VALUES (1);
|
|
INSERT INTO t1 SELECT id+1 FROM t1;
|
|
INSERT INTO t1 SELECT id+2 FROM t1;
|
|
INSERT INTO t1 SELECT id+4 FROM t1;
|
|
INSERT INTO t1 SELECT id+8 FROM t1;
|
|
INSERT INTO t1 SELECT id+16 FROM t1;
|
|
INSERT INTO t1 SELECT id+32 FROM t1;
|
|
INSERT INTO t1 SELECT id+64 FROM t1;
|
|
INSERT INTO t1 SELECT id+128 FROM t1;
|
|
INSERT INTO t1 SELECT id+256 FROM t1;
|
|
INSERT INTO t1 SELECT id+512 FROM t1;
|
|
INSERT INTO t1 SELECT id+1024 FROM t1;
|
|
INSERT INTO t1 SELECT id+2048 FROM t1;
|
|
INSERT INTO t1 SELECT id+4096 FROM t1;
|
|
INSERT INTO t1 SELECT id+8192 FROM t1;
|
|
INSERT INTO t1 SELECT id+16384 FROM t1;
|
|
INSERT INTO t1 SELECT id+32768 FROM t1;
|
|
INSERT INTO t1 SELECT id+65536 FROM t1;
|
|
INSERT INTO t1 SELECT id+131072 FROM t1;
|
|
INSERT INTO t1 SELECT id+262144 FROM t1;
|
|
INSERT INTO t1 SELECT id+524288 FROM t1;
|
|
INSERT INTO t1 SELECT id+1048576 FROM t1;
|
|
INSERT INTO t2 SELECT * FROM t1;
|
|
INSERT INTO t3 SELECT CONCAT(id),id FROM t2 ORDER BY -id;
|
|
INSERT INTO t4 SELECT * FROM t3 ORDER BY CONCAT(a);
|
|
SELECT SUM(id) FROM t3;
|
|
SUM(id)
|
|
2199024304128
|
|
DROP TABLE t1,t2,t3,t4;
|
|
CREATE TABLE t1 (f1 int NOT NULL) ENGINE=InnoDB;
|
|
CREATE TABLE t2 (f2 int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
|
|
CREATE TRIGGER t1_bi before INSERT
|
|
ON t1 FOR EACH ROW
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @a:= 'deadlock';
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
|
|
INSERT INTO t2 (f2) VALUES (NEW.f1);
|
|
DELETE FROM t2 WHERE f2 = NEW.f1;
|
|
END;|
|
|
CREATE PROCEDURE proc24989()
|
|
BEGIN
|
|
DECLARE CONTINUE HANDLER FOR SQLSTATE '40001' SET @b:= 'deadlock';
|
|
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @a:= 'exception';
|
|
INSERT INTO t2 (f2) VALUES (1);
|
|
DELETE FROM t2 WHERE f2 = 1;
|
|
END;|
|
|
create procedure proc24989_2()
|
|
deterministic
|
|
begin
|
|
declare continue handler for sqlexception
|
|
select 'Outer handler' as 'exception';
|
|
insert into t1 values(1);
|
|
select "continued";
|
|
end|
|
|
start transaction;
|
|
insert into t1 values(1);
|
|
start transaction;
|
|
insert into t2 values(123);
|
|
insert into t1 values(1);
|
|
insert into t1 values(123);
|
|
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
|
select @a;
|
|
@a
|
|
NULL
|
|
select * from t2;
|
|
f2
|
|
commit;
|
|
start transaction;
|
|
insert into t1 values(1);
|
|
start transaction;
|
|
insert into t2 values(123);
|
|
call proc24989();
|
|
insert into t1 values(123);
|
|
select @a,@b;
|
|
@a @b
|
|
exception deadlock
|
|
select * from t2;
|
|
f2
|
|
commit;
|
|
start transaction;
|
|
insert into t1 values(1);
|
|
start transaction;
|
|
insert into t2 values(123);
|
|
call proc24989_2();
|
|
insert into t1 values(123);
|
|
commit;
|
|
exception
|
|
Outer handler
|
|
continued
|
|
continued
|
|
select * from t2;
|
|
f2
|
|
drop procedure proc24989;
|
|
drop procedure proc24989_2;
|
|
drop table t1,t2;
|