繁体   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