【问题标题】:InnoDB deadlocks when using LOCK TABLES使用 LOCK TABLES 时的 InnoDB 死锁
【发布时间】:2016-03-07 00:08:08
【问题描述】:

我知道 InnoDB 可以检测和解决行级别的死锁,但是当您使用 LOCK TABLES 时会发生什么?

出于某些原因,我发现有时锁定整个表比找出避免潜在死锁的逻辑更容易。

所以,假设你这样做:

LOCK TABLES tableA WRITE, tableB WRITE

现在,两个事务(T1T2)同时尝试此操作。出于某种原因,我们假设T1 无法获得tableA 上的锁,但可以为tableB 获得锁。 然后T2 出现,锁定tableA,但没有锁定tableBT1 有)。这两个人现在互相等待。会发生什么?

  1. 这就是授予锁的方式吗?不管LOCK TABLES指定的顺序如何?如果不是,那是否意味着两个相同的语句永远不会相互死锁?
  2. 有没有办法正确处理这个问题?必须超时吗?

根据手册,可以在事务中使用LOCK TABLES,如下所示:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

【问题讨论】:

    标签: mysql innodb deadlock


    【解决方案1】:

    LOCK TABLES(你需要说READWRITE等)将同时锁定所有表。两个多表LOCK 语句不可能陷入死锁。 UNLOCK TABLES 同时解锁它们。

    【讨论】:

    • 哦,是的,忘记了 R/W 部分(在我的问题中很明显)。太好了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2020-06-17
    相关资源
    最近更新 更多