使用join时MySQL锁定

时间:2012-01-30 02:43:45

标签: mysql transactions innodb locks

在2表连接查询中选择“FOR UPDATE”时,我对mysql / innodb锁定有疑问。例如:

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

1 个答案:

答案 0 :(得分:0)

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