Mysql
MySQL/MariaDB:SELECT 查詢可以阻止 INSERT 查詢嗎?
假設我有一個表單查詢:
INSERT INTO tableA (...) select ... from tableB;
現在,這個查詢是否有可能在執行時阻止普通
INSERT
語句tableB
?附加資訊:
- 所有表都是 InnoDB
- 沒有顯式事務(自動送出已打開)
- 語句中沒有
FOR UPDATE
子句SELECT
(我什至不確定是否可以在INSERT...SELECT
構造中做到這一點)- 實際的 SELECT 查詢顯然更複雜,涉及分組和聯合,但這些不應該改變任何東西,對吧?
- 所有查詢的事務隔離級別是預設的
REPEATABLE READ
- 準確的數據庫版本是 MariaDB 10.0.12
是的,
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
to tableB 必須有一個排他鎖。如果存在任何共享鎖,則不會授予排他鎖。