在2表联接查询中选择"FOR UPDATE"时,我对mysql/innodb锁定有疑问。示例:
2个表-items
、queue
。queue.id
是到items.id(FOREIGN KEY)的1:1连接。queue.status
是带索引的枚举。队列的行数很少,而items表相对较大。
SELECT *
FROM `items`
INNER JOIN queue
ON items.id = queue.id
WHERE queue.status = 'new'
FOR UPDATE;
- 表
items
中所选的行是否以独占方式锁定 - 还获得了哪些其他锁?(显然,
queue
表中stats='new'的所有行除外) - 是否存在可能导致死锁的共享锁。我在某个地方读到insert将下一个密钥共享锁放在autoincrement索引上,然后当使用
SELECT ... FOR UPDATE
(在同一事务中)时,锁将升级为exclusive,很容易发生死锁-两个线程可以获得共享锁,然后它们都会等待对方释放锁以获得exclusive锁。在这种情况下有可能吗(也听说外键是共享锁)
是的,每个选定的行(*)都将被锁定。你真的不需要担心死锁。创建一个需要相当多的时间,当它真的发生时,主要是客户的错。