mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-13115: Implement SELECT SKIP LOCKED
Adds an implementation for SELECT ... FOR UPDATE SKIP LOCKED /
SELECT ... LOCK IN SHARED MODE SKIP LOCKED
This is implemented only InnoDB at the moment, not in RockDB yet.
This adds a new hander flag HA_CAN_SKIP_LOCKED than
will be used when the storage engine advertises the flag.
When a storage engine indicates this flag it will get
TL_WRITE_SKIP_LOCKED and TL_READ_SKIP_LOCKED transaction types.
The Lex structure has been updated to store both the FOR UPDATE/LOCK IN
SHARE as well as the SKIP LOCKED so the SHOW CREATE VIEW
implementation is simplier.
"SELECT FOR UPDATE ... SKIP LOCKED" combined with CREATE TABLE AS or
INSERT.. SELECT on the result set is not safe for STATEMENT based
replication. MIXED replication will replicate this as row based events."
Thanks to guidance from Facebook commit
193896c466
This helped verify basic test case, and components that need implementing
(even though every part was implemented differently).
Thanks Marko for guidance on simplier InnoDB implementation.
Reviewers: Marko, Monty
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
connect con1,localhost,root,,;
|
||||
SET SESSION innodb_lock_wait_timeout=1;
|
||||
connection default;
|
||||
SET SESSION innodb_lock_wait_timeout=1;
|
||||
# Case 1: Test primary index - CREATE TABLE .. SELECT .. SKIP LOCKED
|
||||
CREATE TABLE t1(
|
||||
seat_id INT,
|
||||
state INT,
|
||||
PRIMARY KEY(seat_id)
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1,0), (2,0), (3,0), (4,0);
|
||||
BEGIN;
|
||||
SELECT * FROM t1 WHERE state = 0 LIMIT 2 LOCK IN SHARE MODE;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
connection con1;
|
||||
BEGIN;
|
||||
CREATE TEMPORARY TABLE s0 AS SELECT * FROM t1 WHERE state = 0 LIMIT 2 LOCK IN SHARE MODE;
|
||||
SELECT * FROM s0;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
CREATE TEMPORARY TABLE s1 AS SELECT * FROM t1 WHERE state = 0 LIMIT 2 FOR UPDATE NOWAIT SKIP LOCKED;
|
||||
SELECT * FROM s1;
|
||||
seat_id state
|
||||
3 0
|
||||
4 0
|
||||
connection default;
|
||||
CREATE TEMPORARY TABLE s0 AS SELECT * FROM t1 WHERE state = 0 LOCK IN SHARE MODE NOWAIT SKIP LOCKED;
|
||||
SELECT * FROM s0;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
COMMIT;
|
||||
DROP TABLE s0;
|
||||
connection con1;
|
||||
COMMIT;
|
||||
DROP TABLE s0, s1;
|
||||
connection default;
|
||||
# Case 2: Test primary index - INSERT .. SELECT .. SKIP LOCKED
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
BEGIN;
|
||||
SELECT * FROM t1 WHERE state = 0 LIMIT 2 LOCK IN SHARE MODE;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
connection con1;
|
||||
BEGIN;
|
||||
INSERT INTO t2 SELECT * FROM t1 WHERE state = 0 LIMIT 2 LOCK IN SHARE MODE RETURNING seat_id, state;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
CREATE TEMPORARY TABLE t2s LIKE t1;
|
||||
INSERT INTO t2s SELECT * FROM t1 WHERE state = 0 LIMIT 2 FOR UPDATE NOWAIT SKIP LOCKED RETURNING seat_id, state;
|
||||
seat_id state
|
||||
3 0
|
||||
4 0
|
||||
connection default;
|
||||
CREATE TEMPORARY TABLE t2s LIKE t1;
|
||||
INSERT INTO t2s SELECT * FROM t1 WHERE state = 0 LOCK IN SHARE MODE NOWAIT SKIP LOCKED RETURNING seat_id, state;
|
||||
seat_id state
|
||||
1 0
|
||||
2 0
|
||||
COMMIT;
|
||||
DROP TABLE t2s;
|
||||
connection con1;
|
||||
COMMIT;
|
||||
DROP TABLE t2s;
|
||||
DROP TABLE t2;
|
||||
connection default;
|
||||
DROP TABLE t1;
|
Reference in New Issue
Block a user