首页 文章

使用LOCK TABLES时InnoDB死锁

提问于
浏览
1

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

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

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

LOCK TABLES tableA WRITE, tableB WRITE

现在,两个事务( T1T2 )同时尝试此操作 . 出于某种原因,我们假设 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 回答

  • 1

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

相关问题