在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')。SELECT ... FOR UPDATE
(在同一个事务中)锁被升级为独占时,很容易发生死锁 - 2个线程可以获得共享锁,然后他们都会互相等待释放锁,以获得独占锁。在这种情况下是否可能(也听说外键生成共享锁)。答案 0 :(得分:0)
是每个选定的行(*)都将被锁定。 你真的不需要担心死锁。创建一个它需要很多,当它发生时,它主要是客户端的错误。