开始...提交与锁定表

BEGIN...COMMIT vs LOCK TABLES

下面两组说法有什么区别?

BEGIN;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

LOCK TABLES `table2` WRITE;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

他们做同样的事情吗?如果不是,为什么要用一个代替另一个?

LOCK TABLES 是全局的;它会阻止所有会话,直到您使用 UNLOCK TABLES。这意味着对您锁定的 tables 的访问变为串行。这对于你想做的事情来说可能有点矫枉过正。

而 InnoDB 进行行级锁定。只要不锁定重叠的行集,两个并发会话都可以写入 table。

事务和 LOCK TABLES 之间的交互有点混乱。当您使用 LOCK TABLES 时,InnoDB 存储引擎和 MySQL 服务器都会锁定一个 table。当您提交事务时,InnoDB 释放其 table 锁,但 MySQL 服务器不会这样做。您需要使用 UNLOCK TABLES 来释放它。

当 MySQL 的默认存储引擎是不支持事务的 MyISAM 时,

LOCK TABLES 是一种控制对 table 的访问并确保 repeatable 读取的方法。在 MySQL 的现代版本中应该使用 LOCK TABLES 的情况越来越少。事实上,您可能永远不需要使用 LOCK TABLES。

有关详细信息,请阅读 https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html