开始..提交与锁定表



以下两组语句有什么区别?

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。这意味着对您锁定的表的访问将变为串行。对于您想做的事情来说,这可能是矫枉过正。

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

事务和锁定表之间的交互有点令人困惑。当您使用LOCK TABLES时,InnoDB存储引擎和MySQL服务器都会锁定表。当您提交事务时,InnoDB会释放其表锁,但MySQL服务器不会这样做。您需要使用解锁表来释放它。

锁定表是一种控制对表的访问并确保可重复读取的方法,当时MySQL的默认存储引擎是MyISAM,它不支持事务。您应该在现代版本的MySQL中使用LOCK TABLES的情况越来越少。事实上,您可能永远不需要使用锁定表。

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

最新更新