簡體   English   中英

從MySQL 5.5 InnoDB中的選擇查詢插入

[英]Insert from select queries in MySQL 5.5 InnoDB

我有一個查詢。

INSERT INTO users_resources_locks (resource_id, user_id)
SELECT resources.id, 123 FROM resources
LEFT JOIN users_resources_locks
    ON resources.id = users_resources_locks.resource_id
WHERE users_resources_locks.id IS NULL;

表users_resources_locks在resource_id列上具有唯一索引。

並發查詢能否在查詢的INSERT和SELECT部分​​之間寫入users_resources_locks?

例如,下面的時間軸是否可能具有可重復讀取隔離級別?

1) My query selects ((1, 123), (2, 123), (3, 123)).
2) Concurent query writes into users_resources_locks values ((1, 54321), (2, 54321)) and commits trasaction.
3) My query writes into users_resources_locks values ((1, 123), (2, 123), (3, 123)) and commits transaction fails because of unique constraint.

不,據我所知,像INSERT這樣的DML語句需要排他記錄級別的隱式鎖定,因此,當一個插入正在進行時,另一個INSERT/UPDATE無法通過。 它取決於Reader/Writer鎖和數據庫引擎對鎖兼容性的檢查。

Read Lock - R
Write Lock - W

使用RW / WR/ RR可以兼容所有鎖,因為讀取需要共享鎖(盡管同樣取決於TRANSACTION ISOLATION LEVEL ),但是WW始終是不兼容的鎖。

同樣,如果您的ID列是主鍵或諸如唯一鍵之類的任何鍵列,則它不可能被復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM