mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
13b9ec651a
When the transaction isolation level is SERIALIZABLE, or when a locking read is performed in the REPEATABLE READ isolation level, InnoDB must lock delete-marked records in order to prevent another transaction from inserting something. However, at READ UNCOMMITTED or READ COMMITTED isolation level or when the parameter innodb_locks_unsafe_for_binlog is set, the repeatability of the reads does not matter, and there is no need to lock any records. row_search_mvcc(): Skip locks on delete-marked committed records upfront, instead of invoking row_unlock_for_mysql() afterwards. The unlocking never worked for secondary index records.
57 lines
1.6 KiB
Text
57 lines
1.6 KiB
Text
connect stop_purge, localhost, root,,;
|
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
|
connect delete, localhost, root,,;
|
|
connection default;
|
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB;
|
|
INSERT INTO t1 VALUES(1,1);
|
|
DELETE FROM t1;
|
|
SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked';
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES(1,1);
|
|
connection delete;
|
|
SET DEBUG_SYNC='now WAIT_FOR inserted';
|
|
SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked';
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
|
BEGIN;
|
|
DELETE FROM t1 WHERE b=1;
|
|
connection default;
|
|
connection delete;
|
|
COMMIT;
|
|
connection default;
|
|
SET DEBUG_SYNC='RESET';
|
|
ROLLBACK;
|
|
SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked';
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES(1,1);
|
|
connection delete;
|
|
SET DEBUG_SYNC='now WAIT_FOR inserted';
|
|
SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked';
|
|
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
|
BEGIN;
|
|
DELETE FROM t1 WHERE b=1;
|
|
connection default;
|
|
connection delete;
|
|
COMMIT;
|
|
connection default;
|
|
SET DEBUG_SYNC='RESET';
|
|
ROLLBACK;
|
|
SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked';
|
|
BEGIN;
|
|
SET innodb_lock_wait_timeout=1;
|
|
INSERT INTO t1 VALUES(1,1);
|
|
connection delete;
|
|
SET DEBUG_SYNC='now WAIT_FOR inserted';
|
|
SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked';
|
|
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
|
|
BEGIN;
|
|
DELETE FROM t1 WHERE b=1;
|
|
connection default;
|
|
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
|
COMMIT;
|
|
SET DEBUG_SYNC='RESET';
|
|
connection delete;
|
|
COMMIT;
|
|
disconnect delete;
|
|
disconnect stop_purge;
|
|
connection default;
|
|
DROP TABLE t1;
|