Mysql
為什麼在 SELECT 不插入時將 SELECT 插入到不相關的表塊中?mysql 5.6
簡而言之,我有一個表“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
桌子我之前寫過這個
Apr 25, 2016
: MySQL INSERT … 選擇性能Aug 08, 2014
:MySQL 一致的非鎖定讀取與 INSERT … SELECT(更多詳細資訊)