使用 LOCK TABLES 时 InnoDB 死锁
InnoDB deadlocks when using LOCK TABLES
我知道 InnoDB 可以检测和解决行级别的死锁,但是当您使用 LOCK TABLES
时会发生什么?
出于某些原因,我发现偶尔锁定整个table比找出避免潜在死锁的逻辑更容易。
那么,假设您这样做:
LOCK TABLES tableA WRITE, tableB WRITE
现在,两个事务(T1
和 T2
)同时尝试此操作。出于某种原因,我们假设 T1
无法获取 tableA
上的锁,但可以获得 tableB
上的锁。
然后 T2
出现,锁定 tableA
但不锁定 tableB
(T1
有)。这两个现在互相等待。会发生什么?
- 这是授予锁的方式吗?不管
LOCK TABLES
指定的顺序如何?如果不是那么是否意味着两个相同的语句永远不会相互死锁?
- 有没有办法妥善处理这个问题?一定要超时吗?
根据手册,在交易中 可以使用 LOCK TABLES
,如下所示:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
LOCK TABLES
(你需要说 READ
或 WRITE
等)将同时锁定所有 table。两个 multi-table LOCK
语句不可能陷入死锁。 UNLOCK TABLES
同时解锁。
我知道 InnoDB 可以检测和解决行级别的死锁,但是当您使用 LOCK TABLES
时会发生什么?
出于某些原因,我发现偶尔锁定整个table比找出避免潜在死锁的逻辑更容易。
那么,假设您这样做:
LOCK TABLES tableA WRITE, tableB WRITE
现在,两个事务(T1
和 T2
)同时尝试此操作。出于某种原因,我们假设 T1
无法获取 tableA
上的锁,但可以获得 tableB
上的锁。
然后 T2
出现,锁定 tableA
但不锁定 tableB
(T1
有)。这两个现在互相等待。会发生什么?
- 这是授予锁的方式吗?不管
LOCK TABLES
指定的顺序如何?如果不是那么是否意味着两个相同的语句永远不会相互死锁? - 有没有办法妥善处理这个问题?一定要超时吗?
根据手册,在交易中 可以使用 LOCK TABLES
,如下所示:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
LOCK TABLES
(你需要说 READ
或 WRITE
等)将同时锁定所有 table。两个 multi-table LOCK
语句不可能陷入死锁。 UNLOCK TABLES
同时解锁。