2016-03-07 97 views
0

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

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

所以,让我们假设你做的事:

LOCK TABLES tableA WRITE, tableB WRITE 

现在,两笔交易(T1T2),同时尝试这一点。出于某种原因,我们假设T1无法获得tableA的锁定,但可以获得tableB的锁定。 然后T2出现,得到tableA锁定,但不在tableBT1有那个)。这两个现在在等待对方。怎么了?

  1. 这是如何授予锁;不管LOCK TABLES指定的顺序如何?如果不是,那么这是不是意味着两个相同的陈述永远不会彼此僵化?
  2. 有没有办法正确处理这个问题?它必须超时吗?

根据手册,它没关系交易中使用LOCK TABLES,按指定的位置:https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html

回答

0

LOCK TABLES(和你需要说READWRITE等)将锁定所有表同时。两个多表LOCK语句没有机会陷入僵局。 UNLOCK TABLES同时解锁它们。

+0

哦,是的,忘记了R/W部分(在我的问题中显然)。很好,谢谢。 – nickdnk