在 2 表连接查询中选择“FOR UPDATE”时,我对 mysql/innodb 锁定有疑问。例子:
2 表 - items
, queue
. queue.id
是与 items.id(外键)的 1:1 连接。queue.status
是带索引的枚举。queue 的行数很少,而 items 表相对较大。
SELECT *
FROM `items`
INNER JOIN queue
ON items.id = queue.id
WHERE queue.status = 'new'
FOR UPDATE;
- 表中选定的行会被排
items
他锁定吗? - 还获得了哪些其他锁?(显然,
queue
表中所有具有 stats='new' 的行除外)。 - 是否有任何可能导致死锁的共享锁。我在某处读过 insert 将下一个键共享锁放在自动增量索引上,然后在使用
SELECT ... FOR UPDATE
(在同一个事务中)锁时将其升级为独占,很容易发生死锁 - 2 个线程可以获得共享锁,然后他们都将等待对方释放锁以获得排他锁。在这种情况下是否可能(也听说外键使共享锁)。