简体   繁体   English

从MySQL 5.5 InnoDB中的选择查询插入

[英]Insert from select queries in MySQL 5.5 InnoDB

I have a query. 我有一个查询。

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;

Table users_resources_locks has unique index on column resource_id. 表users_resources_locks在resource_id列上具有唯一索引。

Could concurrent query write into users_resources_locks between INSERT and SELECT part of my query? 并发查询能否在查询的INSERT和SELECT部分​​之间写入users_resources_locks?

For example is timeline below possible in repeatable read isolation level? 例如,下面的时间轴是否可能具有可重复读取隔离级别?

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.

NO, per my knowledge an DML statement like INSERT takes an exclusive record level implicit lock and so while one insert is in progress another INSERT/UPDATE can't go through. 不,据我所知,像INSERT这样的DML语句需要排他记录级别的隐式锁定,因此,当一个插入正在进行时,另一个INSERT/UPDATE无法通过。 It depends on Reader/Writer locks and DB engine checks on lock compatibility. 它取决于Reader/Writer锁和数据库引擎对锁兼容性的检查。

Read Lock - R
Write Lock - W

With this a RW / WR/ RR are all compatible locks since read needs a shared lock (again depends on TRANSACTION ISOLATION LEVEL though) but a WW is a non-compatible lock always. 使用RW / WR/ RR可以兼容所有锁,因为读取需要共享锁(尽管同样取决于TRANSACTION ISOLATION LEVEL ),但是WW始终是不兼容的锁。

Also, if your ID column is a primary key or any key column like unique key then there is no way it can get duplicated. 同样,如果您的ID列是主键或诸如唯一键之类的任何键列,则它不可能被复制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM