EVOLUTION-MANAGER
Edit File: locking_issues.result
----------------------------------------------------------------------- - Locking issues case 1.1: - Locking rows that do not exist when using all primary key columns in - a WHERE clause - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id1 INT, id2 INT, value INT, PRIMARY KEY(id1, id2)); INSERT INTO t0 VALUES (1,1,0), (3,3,0), (4,4,0), (6,6,0); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; SELECT * FROM t0 WHERE id1=1 AND id2=5 FOR UPDATE; id1 id2 value connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; INSERT INTO t0 VALUES (1,5,0); ERROR HY000: Lock wait timeout exceeded; try restarting transaction SELECT * FROM t0 WHERE id1=1 AND id2=5 FOR UPDATE; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 1.1: - Locking rows that do not exist when using all primary key columns in - a WHERE clause - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id1 INT, id2 INT, value INT, PRIMARY KEY(id1, id2)); INSERT INTO t0 VALUES (1,1,0), (3,3,0), (4,4,0), (6,6,0); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM t0 WHERE id1=1 AND id2=5 FOR UPDATE; id1 id2 value connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; INSERT INTO t0 VALUES (1,5,0); ERROR HY000: Lock wait timeout exceeded; try restarting transaction SELECT * FROM t0 WHERE id1=1 AND id2=5 FOR UPDATE; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 1.2: - Locking rows that do not exist without using all primary key - columns in a WHERE clause - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id1 INT, id2 INT, value INT, PRIMARY KEY(id1, id2)); INSERT INTO t0 VALUES (1,1,0), (3,3,0), (4,4,0), (6,6,0); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; SELECT * FROM t0 WHERE id1=1 FOR UPDATE; id1 id2 value 1 1 0 connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; SELECT * FROM t0 WHERE id1=1 AND id2=4 FOR UPDATE; id1 id2 value INSERT INTO t0 VALUES (1,5,0); connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 1.2: - Locking rows that do not exist without using all primary key - columns in a WHERE clause - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id1 INT, id2 INT, value INT, PRIMARY KEY(id1, id2)); INSERT INTO t0 VALUES (1,1,0), (3,3,0), (4,4,0), (6,6,0); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM t0 WHERE id1=1 FOR UPDATE; id1 id2 value 1 1 0 connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM t0 WHERE id1=1 AND id2=4 FOR UPDATE; id1 id2 value INSERT INTO t0 VALUES (1,5,0); connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 2: - Rows that are scanned but do not match the WHERE are not locked - using REPEATABLE READ transaction isolation level unless - rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 CREATE TABLE t0(id INT PRIMARY KEY, value INT); INSERT INTO t0 VALUES (1,0), (2,1), (3,0), (4,0), (5,1); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con1; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; id value 2 1 5 1 connection con2; UPDATE t0 SET VALUE=10 WHERE id=1; UPDATE t0 SET VALUE=10 WHERE id=5; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; UPDATE t0 SET value=100 WHERE id in (4,5) and value>0; connection con2; SELECT * FROM t0 WHERE id=4 FOR UPDATE; id value 4 0 COMMIT; SELECT * FROM t0; id value 1 10 2 1 3 0 4 0 5 1 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 2: - Rows that are scanned but do not match the WHERE are not locked - using READ COMMITTED transaction isolation level unless - rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 CREATE TABLE t0(id INT PRIMARY KEY, value INT); INSERT INTO t0 VALUES (1,0), (2,1), (3,0), (4,0), (5,1); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con1; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; id value 2 1 5 1 connection con2; UPDATE t0 SET VALUE=10 WHERE id=1; UPDATE t0 SET VALUE=10 WHERE id=5; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; UPDATE t0 SET value=100 WHERE id in (4,5) and value>0; connection con2; SELECT * FROM t0 WHERE id=4 FOR UPDATE; id value 4 0 COMMIT; SELECT * FROM t0; id value 1 10 2 1 3 0 4 0 5 1 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 2: - Rows that are scanned but do not match the WHERE are not locked - using REPEATABLE READ transaction isolation level unless - rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 SET GLOBAL rocksdb_lock_scanned_rows=ON; CREATE TABLE t0(id INT PRIMARY KEY, value INT); INSERT INTO t0 VALUES (1,0), (2,1), (3,0), (4,0), (5,1); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con1; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; id value 2 1 5 1 connection con2; UPDATE t0 SET VALUE=10 WHERE id=1; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; SET GLOBAL rocksdb_lock_scanned_rows=0; ----------------------------------------------------------------------- - Locking issues case 2: - Rows that are scanned but do not match the WHERE are not locked - using READ COMMITTED transaction isolation level unless - rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 SET GLOBAL rocksdb_lock_scanned_rows=ON; CREATE TABLE t0(id INT PRIMARY KEY, value INT); INSERT INTO t0 VALUES (1,0), (2,1), (3,0), (4,0), (5,1); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con1; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; id value 2 1 5 1 connection con2; UPDATE t0 SET VALUE=10 WHERE id=1; ERROR HY000: Lock wait timeout exceeded; try restarting transaction connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; SET GLOBAL rocksdb_lock_scanned_rows=0; ----------------------------------------------------------------------- - Locking issues case 3: - After creating a snapshot, other clients updating rows - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; UPDATE t0 SET VALUE=VALUE+1 WHERE id=190000; connection con1; ERROR: 1213 connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 3: - After creating a snapshot, other clients updating rows - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; UPDATE t0 SET VALUE=VALUE+1 WHERE id=190000; connection con1; id value 190000 1 ERROR: 0 connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 4: - Phantom rows - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; INSERT INTO t0 VALUES(200001,1), (-1,1); connection con1; id value connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 4: - Phantom rows - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; INSERT INTO t0 VALUES(200001,1), (-1,1); connection con1; id value connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 5: - Deleting primary key - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows UPDATE t0 SET value=100 WHERE id=190000; connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; DELETE FROM t0 WHERE id=190000; COMMIT; connection con1; ERROR: 1213 COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 5: - Deleting primary key - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows UPDATE t0 SET value=100 WHERE id=190000; connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; DELETE FROM t0 WHERE id=190000; COMMIT; connection con1; id value ERROR: 0 COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 6: - Changing primary key - using REPEATABLE READ transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows UPDATE t0 SET value=100 WHERE id=190000; connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; UPDATE t0 SET id=200001 WHERE id=190000; COMMIT; connection con1; ERROR: 1213 COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 6: - Changing primary key - using READ COMMITTED transaction isolation level ----------------------------------------------------------------------- DROP TABLE IF EXISTS t0; CREATE TABLE t0(id INT AUTO_INCREMENT PRIMARY KEY, value INT); Inserting 200,000 rows UPDATE t0 SET value=100 WHERE id=190000; connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; SELECT * FROM t0 WHERE value > 0 FOR UPDATE; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; UPDATE t0 SET id=200001 WHERE id=190000; COMMIT; connection con1; id value ERROR: 0 COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t0; ----------------------------------------------------------------------- - Locking issues case 7: - Rows that are scanned as part of a query but not in the table being - updated should not be locked unless rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t1, t2; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 CREATE TABLE t1(id INT PRIMARY KEY, value INT); CREATE TABLE t2(id INT PRIMARY KEY, value INT); INSERT INTO t1 VALUES (1,1), (2,2), (3,3); INSERT INTO t2 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; lock_scanned_rows is 0 connection con1; UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.value=t1.value+100 WHERE t2.id=3; connection con2; UPDATE t2 SET value=value+100; SELECT * FROM t2; id value 1 101 2 102 3 103 4 104 5 105 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t1; DROP TABLE t2; ----------------------------------------------------------------------- - Locking issues case 7: - Rows that are scanned as part of a query but not in the table being - updated should not be locked unless rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t1, t2; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 CREATE TABLE t1(id INT PRIMARY KEY, value INT); CREATE TABLE t2(id INT PRIMARY KEY, value INT); INSERT INTO t1 VALUES (1,1), (2,2), (3,3); INSERT INTO t2 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; lock_scanned_rows is 0 connection con1; UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.value=t1.value+100 WHERE t2.id=3; connection con2; UPDATE t2 SET value=value+100; SELECT * FROM t2; id value 1 101 2 102 3 103 4 104 5 105 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t1; DROP TABLE t2; ----------------------------------------------------------------------- - Locking issues case 7: - Rows that are scanned as part of a query but not in the table being - updated should not be locked unless rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t1, t2; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 SET GLOBAL rocksdb_lock_scanned_rows=ON; CREATE TABLE t1(id INT PRIMARY KEY, value INT); CREATE TABLE t2(id INT PRIMARY KEY, value INT); INSERT INTO t1 VALUES (1,1), (2,2), (3,3); INSERT INTO t2 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; lock_scanned_rows is 1 connection con1; UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.value=t1.value+100 WHERE t2.id=3; connection con2; UPDATE t2 SET value=value+100 WHERE id=3; ERROR HY000: Lock wait timeout exceeded; try restarting transaction UPDATE t2 SET value=value+100 WHERE id IN (1,2,4,5); SELECT * FROM t2; id value 1 101 2 102 3 3 4 104 5 105 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t1; DROP TABLE t2; SET GLOBAL rocksdb_lock_scanned_rows=0; ----------------------------------------------------------------------- - Locking issues case 7: - Rows that are scanned as part of a query but not in the table being - updated should not be locked unless rocksdb_lock_scanned_rows is on ----------------------------------------------------------------------- DROP TABLE IF EXISTS t1, t2; SELECT @@global.rocksdb_lock_scanned_rows; @@global.rocksdb_lock_scanned_rows 0 SET GLOBAL rocksdb_lock_scanned_rows=ON; CREATE TABLE t1(id INT PRIMARY KEY, value INT); CREATE TABLE t2(id INT PRIMARY KEY, value INT); INSERT INTO t1 VALUES (1,1), (2,2), (3,3); INSERT INTO t2 VALUES (1,1), (2,2), (3,3), (4,4), (5,5); connect con1,localhost,root,,; connect con2,localhost,root,,; connection con1; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; connection con2; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN; lock_scanned_rows is 1 connection con1; UPDATE t1 JOIN t2 ON t1.id = t2.id SET t1.value=t1.value+100 WHERE t2.id=3; connection con2; UPDATE t2 SET value=value+100 WHERE id=3; ERROR HY000: Lock wait timeout exceeded; try restarting transaction UPDATE t2 SET value=value+100 WHERE id IN (1,2,4,5); SELECT * FROM t2; id value 1 101 2 102 3 3 4 104 5 105 connection con1; COMMIT; connection default; disconnect con1; disconnect con2; DROP TABLE t1; DROP TABLE t2; SET GLOBAL rocksdb_lock_scanned_rows=0;