【发布时间】:2016-03-07 00:08:08
【问题描述】:
我知道 InnoDB 可以检测和解决行级别的死锁,但是当您使用 LOCK TABLES 时会发生什么?
出于某些原因,我发现有时锁定整个表比找出避免潜在死锁的逻辑更容易。
所以,假设你这样做:
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
【问题讨论】: