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

时间:2015-09-07 21:28:19

标签: mysql concurrency

我有一个查询。

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.

1 个答案:

答案 0 :(得分:1)

不,据我所知,像INSERT这样的DML语句采用独占记录级隐式锁定,因此当一个插入正在进行时,另一个INSERT/UPDATE无法通过。它取决于Reader/Writer锁和数据库引擎检查锁兼容性。

Read Lock - R
Write Lock - W

使用此RW / WR/ RR是所有兼容的锁,因为读取需要共享锁(但同样取决于TRANSACTION ISOLATION LEVEL),但WW始终是不兼容的锁。

此外,如果您的ID列是主键或任何键列(如唯一键),则无法将其复制。