使用join时MySQL锁定

使用join时MySQL锁定,mysql,transactions,innodb,locks,Mysql,Transactions,Innodb,Locks,在2表联接查询中选择“FOR UPDATE”时,我对mysql/innodb锁定有疑问。例如: 2个表-项目,队列queue.id是与items.id(外键)的1:1连接队列。状态为带有索引的枚举。队列的行数非常少,而items表相对较大 SELECT * FROM `items` INNER JOIN queue ON items.id = queue.id WHERE queue.status = 'new' FOR UPDATE; 表项目中的选定行是否会被独占锁定

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

2个表-
项目
队列
queue.id
是与items.id(外键)的1:1连接<代码>队列。状态为带有索引的枚举。队列的行数非常少,而items表相对较大

SELECT *
  FROM `items`
  INNER JOIN queue
    ON items.id = queue.id
  WHERE queue.status = 'new'
  FOR UPDATE;
  • 项目
    中的选定行是否会被独占锁定
  • 获得了哪些其他锁?(显然,
    队列
    表中包含stats='new'的所有行除外)
  • 是否存在可能导致死锁的共享锁。我在某个地方读到insert将下一个密钥共享锁放在自动增量索引上,然后在使用
    选择时。。。对于UPDATE
    (在同一事务中),锁被升级为独占,很容易发生死锁-两个线程可以获得共享锁,然后它们都将等待对方释放锁以获得独占锁。在这种情况下是否有可能(也听说外键构成共享锁)
  • 是每个选定行(*)都将被锁定。 您真的不需要担心死锁。创建一个需要相当多的时间,当它发生时,主要是客户的错误