LOCK TABLES 会导致 InnoDB 中的死锁吗?

LOCK TABLES can cause deadlocks in InnoDB?

来自MySQL手册(https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html):

To reduce the possibility of deadlocks, use transactions rather than LOCK TABLES statements

在 InnoDB 中使用锁表如何导致死锁?

例如,如果我写

SET autocommit=0;
LOCK TABLES t1 WRITE, t2 WRITE, t3 WRITE, t4 WRITE;
... do something with tables t1-t4 here ...
COMMIT;
UNLOCK TABLES;

每次执行此脚本时我真的必须检查 1213 之类的错误吗?

如果您确保在一个 LOCK TABLES 语句中锁定 所有 您将读取或写入的 table,您应该能够避免死锁。

如果可以使用事务来避免使用 LOCK TABLES 的另一个很好的理由是允许行级锁定。 LOCK TABLES 仅在 table 级别锁定,这意味着并发会话不能触及 table 中的任何行,即使您的会话不需要锁定它们。

这对于需要允许多个会话同时访问 table 的软件来说是一个缺点。您正在强制 table 级锁定,这将限制您的软件的吞吐量,因为访问 tables 的所有会话将相互排队,并被迫串行执行。

What do you mean by "use t2"? A READ lock? What if I'm using only WRITE locks like in my example.

我想他的意思是如果你读到 table t2。由于您已将 table 锁定为 WRITE,这也包括阻止该 table 的任何读者。在您解锁之前,其他会话无法读取或写入 table。

I'm not concerned about performance. I have a situation where I want to make things as simple as possible and LOCK TABLES feels much more intuitive to me than using transactions with paranoid level error checking.

你最终会发现一个案例,你希望你的软件有好的性能。您必须变得更加舒适table 使用交易。