4

在 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;
  1. 表中选定的行会被排items他锁定吗?
  2. 还获得了哪些其他锁?(显然,queue表中所有具有 stats='new' 的行除外)。
  3. 是否有任何可能导致死锁的共享锁。我在某处读过 insert 将下一个键共享锁放在自动增量索引上,然后在使用SELECT ... FOR UPDATE(在同一个事务中)锁时将其升级为独占,很容易发生死锁 - 2 个线程可以获得共享锁,然后他们都将等待对方释放锁以获得排他锁。在这种情况下是否可能(也听说外键使共享锁)。
4

1 回答 1

0

是的,每个选定的行 (*) 都将被锁定。你真的不需要担心死锁。创建一个需要很多时间,当它发生时,主要是客户的错。

于 2012-06-09T09:35:40.373 回答