我知道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
答案 0 :(得分:1)
LOCK TABLES
(您需要说READ
或WRITE
等)将同时锁定所有表格。两个多表LOCK
语句不可能陷入死锁。 UNLOCK TABLES
同时解锁它们。