Mysql

為什麼在 SELECT 不插入時將 SELECT 插入到不相關的表塊中?mysql 5.6

  • May 29, 2019

簡而言之,我有一個表“app”,其中有一個主自動增量欄位 app_id,並且一個欄位 created_at datetime 不為空。

我有另一個表“app_subset”,只有一個鍵“app_id”。

如果我執行這樣的查詢:

SELECT app_id FROM app;

然後在執行時,我執行:

INSERT INTO app (created_at) VALUES (NOW());

插入立即執行,而不是等待選擇完成。

但是,如果我執行這樣的查詢:

INSERT IGNORE INTO app_subset SELECT app_id FROM app;

然後在應用程序中執行相同的插入:

INSERT INTO app (created_at) VALUES (NOW());

現在 INSERT INTO 應用程序查詢塊,等待 INSERT IGNORE 完成。

我試圖理解為什麼會這樣。我知道我的選擇結果將被 INSERT INTO 應用程序更改,但似乎如果原始 SELECT 沒有阻塞,那麼使用該選擇結果的 INSERT 也不應該阻塞。我希望能夠進行設置,以便以某種方式出現這種情況,或者至少完全理解為什麼會發生這種情況,以便我可以預見未來會出現類似問題。

從下面 Rolando 的回答中,聽起來 READ UNCOMMITED 應該可以工作,而且當我執行時:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

INSERT IGNORE .. SELECT 不再導致我的 INSERT INTO 應用程序阻塞。

我很好奇是否有辦法將其作為單行來執行(例如:)

INSERT IGNORE INTO app_subset SELECT app_id FROM app LOCK IN NONSHARING MODE;

實際上,INSERT INTO .. SELECT確實鎖定了SELECT桌子

我之前寫過這個

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