mirror of
https://github.com/MariaDB/server.git
synced 2025-12-13 20:03:16 +03:00
weakens the locks for this session similarly like the option innodb_locks_unsafe_for_binlog. This patch removes almost all gap locking (used in next-key locking) and makes MySQL to release the row locks on the rows which does not belong to result set. Additionally, nonlocking selects on INSERT INTO SELECT, UPDATE ... (SELECT ...), and CREATE ... SELECT ... use a nonlocking consistent read. If a binlog is used, then binlog format should be set to row based binloging to make the execution of the complex SQL statements.
400 lines
9.0 KiB
Plaintext
400 lines
9.0 KiB
Plaintext
-- source include/have_innodb.inc
|
|
#
|
|
# Note that these tests uses options
|
|
# innodb_locks_unsafe_for_binlog = true
|
|
# innodb_lock_timeout = 5
|
|
|
|
#
|
|
# Test cases for a bug #15650
|
|
#
|
|
|
|
--disable_warnings
|
|
drop table if exists t1,t2;
|
|
--enable_warnings
|
|
create table t1 (id int not null, f_id int not null, f int not null,
|
|
primary key(f_id, id)) engine=innodb;
|
|
create table t2 (id int not null,s_id int not null,s varchar(200),
|
|
primary key(id)) engine=innodb;
|
|
INSERT INTO t1 VALUES (8, 1, 3);
|
|
INSERT INTO t1 VALUES (1, 2, 1);
|
|
INSERT INTO t2 VALUES (1, 0, '');
|
|
INSERT INTO t2 VALUES (8, 1, '');
|
|
commit;
|
|
DELETE ml.* FROM t1 AS ml LEFT JOIN t2 AS mm ON (mm.id=ml.id)
|
|
WHERE mm.id IS NULL;
|
|
select ml.* from t1 as ml left join t2 as mm on (mm.id=ml.id)
|
|
where mm.id is null lock in share mode;
|
|
drop table t1,t2;
|
|
|
|
#
|
|
# Test case for unlock row bug where unlock releases all locks granted for
|
|
# a row. Only the latest lock should be released.
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values(1,1),(2,2),(3,1),(4,2),(5,1),(6,2),(7,3);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t1 lock in share mode;
|
|
update t1 set b = 5 where b = 1;
|
|
connection b;
|
|
set autocommit = 0;
|
|
#
|
|
# S-lock to records (2,2),(4,2), and (6,2) should not be released in a update
|
|
#
|
|
--error 1205
|
|
select * from t1 where a = 2 and b = 2 for update;
|
|
connection a;
|
|
commit;
|
|
connection b;
|
|
commit;
|
|
drop table t1;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
|
|
#
|
|
# unlock row test
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values(1,1),(2,2),(3,1),(4,2),(5,1),(6,2),(7,3);
|
|
commit;
|
|
set autocommit = 0;
|
|
update t1 set b = 5 where b = 1;
|
|
connection b;
|
|
set autocommit = 0;
|
|
#
|
|
# X-lock to record (7,3) should be released in a update
|
|
#
|
|
select * from t1 where a = 7 and b = 3 for update;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
drop table t1;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
|
|
|
|
#
|
|
# Consistent read should be used in following selects
|
|
#
|
|
# 1) INSERT INTO ... SELECT
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (8,6),(12,1),(3,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
insert into t1 select * from t2;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 2) UPDATE ... = ( SELECT ...)
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(d int not null, e int, primary key(d)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
update t1 set b = (select e from t2 where a = d);
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 3) CREATE ... SELECT
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb
|
|
select * from t2;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# Consistent read should not be used if isolation level is serializable
|
|
#
|
|
|
|
# 1) INSERT INTO ... SELECT
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (8,6),(12,1),(3,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
--error 1205
|
|
insert into t1 select * from t2;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 2) UPDATE ... = ( SELECT ...)
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(d int not null, e int, primary key(d)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
--error 1205
|
|
update t1 set b = (select e from t2 where a = d);
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 3) CREATE ... SELECT
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
|
|
--error 1205
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb
|
|
select * from t2;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t2;
|
|
|
|
#
|
|
# Consistent read should not be used if locking read is used case
|
|
# (a) lock in share mode
|
|
#
|
|
|
|
# 1) INSERT INTO ... SELECT
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (8,6),(12,1),(3,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
insert into t1 select * from t2 lock in share mode;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 2) UPDATE ... = ( SELECT ...)
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(d int not null, e int, primary key(d)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
update t1 set b = (select e from t2 where a = d lock in share mode);
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 3) CREATE ... SELECT
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb select * from t2 lock in share mode;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t2;
|
|
|
|
#
|
|
# Consistent read should not be used if locking read is used case
|
|
# (b) for update
|
|
#
|
|
|
|
# 1) INSERT INTO ... SELECT
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (8,6),(12,1),(3,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
insert into t1 select * from t2 for update;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 2) UPDATE ... = ( SELECT ...)
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t1 values (1,2),(5,3),(4,2);
|
|
create table t2(d int not null, e int, primary key(d)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
update t1 set b = (select e from t2 where a = d for update);
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t1, t2;
|
|
|
|
#
|
|
# 3) CREATE ... SELECT
|
|
#
|
|
|
|
connect (a,localhost,root,,);
|
|
connect (b,localhost,root,,);
|
|
connection a;
|
|
create table t2(a int not null, b int, primary key(a)) engine=innodb;
|
|
insert into t2 values (1,6),(5,1),(4,1);
|
|
commit;
|
|
set autocommit = 0;
|
|
select * from t2 for update;
|
|
connection b;
|
|
set autocommit = 0;
|
|
--error 1205
|
|
create table t1(a int not null, b int, primary key(a)) engine=innodb select * from t2 for update;
|
|
commit;
|
|
connection a;
|
|
commit;
|
|
connection default;
|
|
disconnect a;
|
|
disconnect b;
|
|
drop table t2;
|