mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for Bug #18184 SELECT ... FOR UPDATE does not work..: implemented ha_ndblcuster::unlock_row() and explicitly lock all rows that are not being unlocked
This commit is contained in:
@ -63,3 +63,62 @@ pk u o
|
||||
5 5 5
|
||||
insert into t1 values (1,1,1);
|
||||
drop table t1;
|
||||
create table t1 (x integer not null primary key, y varchar(32)) engine = ndb;
|
||||
insert into t1 values (1,'one'), (2,'two'),(3,"three");
|
||||
begin;
|
||||
select * from t1 where x = 1 for update;
|
||||
x y
|
||||
1 one
|
||||
begin;
|
||||
select * from t1 where x = 2 for update;
|
||||
x y
|
||||
2 two
|
||||
select * from t1 where x = 1 for update;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
commit;
|
||||
begin;
|
||||
select * from t1 where y = 'one' or y = 'three' for update;
|
||||
x y
|
||||
3 three
|
||||
1 one
|
||||
begin;
|
||||
select * from t1 where x = 2 for update;
|
||||
x y
|
||||
2 two
|
||||
select * from t1 where x = 1 for update;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
commit;
|
||||
begin;
|
||||
select * from t1 where x = 1 lock in share mode;
|
||||
x y
|
||||
1 one
|
||||
begin;
|
||||
select * from t1 where x = 1 lock in share mode;
|
||||
x y
|
||||
1 one
|
||||
select * from t1 where x = 2 for update;
|
||||
x y
|
||||
2 two
|
||||
select * from t1 where x = 1 for update;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
commit;
|
||||
begin;
|
||||
select * from t1 where y = 'one' or y = 'three' lock in share mode;
|
||||
x y
|
||||
3 three
|
||||
1 one
|
||||
begin;
|
||||
select * from t1 where y = 'one' lock in share mode;
|
||||
x y
|
||||
1 one
|
||||
select * from t1 where x = 2 for update;
|
||||
x y
|
||||
2 two
|
||||
select * from t1 where x = 1 for update;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
commit;
|
||||
drop table t1;
|
||||
|
@ -69,4 +69,80 @@ insert into t1 values (1,1,1);
|
||||
|
||||
drop table t1;
|
||||
|
||||
# Lock for update
|
||||
|
||||
create table t1 (x integer not null primary key, y varchar(32)) engine = ndb;
|
||||
|
||||
insert into t1 values (1,'one'), (2,'two'),(3,"three");
|
||||
|
||||
# PK access
|
||||
connection con1;
|
||||
begin;
|
||||
select * from t1 where x = 1 for update;
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
select * from t1 where x = 2 for update;
|
||||
--error 1205
|
||||
select * from t1 where x = 1 for update;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
commit;
|
||||
|
||||
# scan
|
||||
connection con1;
|
||||
begin;
|
||||
select * from t1 where y = 'one' or y = 'three' for update;
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
# Have to check with pk access here since scans take locks on
|
||||
# all rows and then release them in chunks
|
||||
select * from t1 where x = 2 for update;
|
||||
--error 1205
|
||||
select * from t1 where x = 1 for update;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
commit;
|
||||
|
||||
# share locking
|
||||
|
||||
# PK access
|
||||
connection con1;
|
||||
begin;
|
||||
select * from t1 where x = 1 lock in share mode;
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
select * from t1 where x = 1 lock in share mode;
|
||||
select * from t1 where x = 2 for update;
|
||||
--error 1205
|
||||
select * from t1 where x = 1 for update;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
commit;
|
||||
|
||||
# scan
|
||||
connection con1;
|
||||
begin;
|
||||
select * from t1 where y = 'one' or y = 'three' lock in share mode;
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
select * from t1 where y = 'one' lock in share mode;
|
||||
# Have to check with pk access here since scans take locks on
|
||||
# all rows and then release them in chunks
|
||||
select * from t1 where x = 2 for update;
|
||||
--error 1205
|
||||
select * from t1 where x = 1 for update;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
commit;
|
||||
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
Reference in New Issue
Block a user