使用 LOCK TABLES 时 InnoDB 死锁

InnoDB deadlocks when using LOCK TABLES

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

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

那么,假设您这样做:

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

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