使用LOCK TABLES时InnoDB死锁

时间:2016-03-07 00:08:09

标签: mysql innodb deadlock

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

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

所以,我们假设你这样做:

LOCK TABLES tableA WRITE, tableB WRITE

现在,两个交易(T1T2)同时尝试此操作。出于某种原因,我们假设T1无法锁定tableA,但可能会获得tableB的锁定。 然后T2出现,锁定tableA但不锁定tableBT1有此锁定)。这两个现在互相等待。会发生什么?

  1. 这是锁定的方式;无论LOCK TABLES指定的顺序如何?如果没有,那么这并不意味着两个相同的陈述永远不会相互僵局吗?
  2. 有没有办法正确处理?它必须暂停吗?
  3. 根据手册, 可以在交易中使用LOCK TABLES,如下所示:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

1 个答案:

答案 0 :(得分:1)

LOCK TABLES(您需要说READWRITE等)将同时锁定所有表格。两个多表LOCK语句不可能陷入死锁。 UNLOCK TABLES同时解锁它们。