使用联接时MySQL锁定



在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. 是否存在可能导致死锁的共享锁。我在某个地方读到insert将下一个密钥共享锁放在autoincrement索引上,然后当使用SELECT ... FOR UPDATE(在同一事务中)时,锁将升级为exclusive,很容易发生死锁-两个线程可以获得共享锁,然后它们都会等待对方释放锁以获得exclusive锁。在这种情况下有可能吗(也听说外键是共享锁)

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

最新更新