我知道InnoDB可以检测并解决行级别的死锁,但是当你使用 LOCK TABLES
时会发生什么?
出于某些原因,我发现 occasionally 更容易锁定整个表而不是找出避免潜在死锁的逻辑 .
所以,我们假设您这样做:
LOCK TABLES tableA WRITE, tableB WRITE
现在,两个事务( T1
和 T2
)同时尝试此操作 . 出于某种原因,我们假设 T1
无法获取 tableA
上的锁定,但可以获得 tableB
的锁定 . 然后 T2
出现,在 tableA
上获得锁定但在 tableB
上没有锁定( T1
有此) . 这两个现在互相等待 . 怎么了?
-
这是锁定的方式;无论
LOCK TABLES
指定的顺序如何?如果没有,那么这并不意味着两个相同的陈述永远不会相互僵局吗? -
有没有办法正确处理?它必须暂停吗?
根据手册, is 可以在一个事务中使用 LOCK TABLES
,如下所示:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
1 回答
LOCK TABLES
(您需要说READ
或WRITE
等)将同时锁定所有表 . 两个多表LOCK
语句不可能陷入死锁 .UNLOCK TABLES
同时解锁它们 .