Vil*_*lx- 3 mysql mariadb insert locking blocking
假设我有一个以下形式的查询:
INSERT INTO tableA (...) select ... from tableB;
Run Code Online (Sandbox Code Playgroud)
现在,这个查询在执行时是否有可能阻止普通INSERT
语句tableB
?附加信息:
FOR UPDATE
语句中没有子句SELECT
(我什至不确定是否可以在INSERT...SELECT
构造中做到这一点)REPEATABLE READ
是的,SELECT
在这种情况下是锁定选择。
如果您SELECT
在任何更改数据的查询中使用,它隐式是一个锁定查询,就像您使用过一样SELECT ... LOCK IN SHARE MODE
。这会在它读取的行上放置一个共享锁。
任何其他更改数据的语句的行为方式相同。这包括以下情况:
INSERT ... SELECT ...
CREATE TABLE ... AS SELECT ...
SELECT ... INTO variable
或者... INTO OUTFILE
SET @variable = (SELECT ...)
INSERT
//上UPDATE
的触发器在其主体中DELETE
运行 a SELECT
。UPDATE
orDELETE
语句中的子查询共享锁可以由多个并发会话持有。所以你可以INSERT ... SELECT
在多个事务中执行此查询。他们不会互相冲突。
但INSERT
对tableB必须有独占锁。如果存在任何共享锁,则不会授予独占锁。