Mysql

MySQL/MariaDB:SELECT 查詢可以阻止 INSERT 查詢嗎?

  • October 4, 2021

假設我有一個表單查詢:

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//在其主體UPDATEDELETE執行 a的觸發器。SELECT
  • UPDATEorDELETE語句中的子查詢
  • 其他情況…

一個共享鎖可能被多個並發會話持有。因此,您可以INSERT ... SELECT在多個事務中執行此查詢。他們不會互相衝突。

但是一個INSERTto tableB 必須有一個排他鎖。如果存在任何共享鎖,則不會授予排他鎖。

引用自:https://dba.stackexchange.com/questions/300543