下面两组语句的区别是什么?
BEGIN;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
LOCK TABLES `table2` WRITE;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;
他们会做同样的事情吗?如果不是,为什么要使用一个而不是另一个呢?
发布于 2020-01-24 09:58:14
LOCK TABLES是全局的;它会阻止所有会话,直到您使用解锁表。这意味着对您锁定的表的访问变成了串行访问。这可能对你想要做的事情有点过分了。
而InnoDB执行行级锁定。只要不锁定重叠的行集,两个并发会话都可以写入表。
事务和锁表之间的交互有点混乱。使用锁定表时,InnoDB存储引擎和MySQL服务器都会锁定表。当您提交事务时,InnoDB将释放其表锁,但MySQL服务器不会执行同样的操作。您需要使用解锁表来释放它。
当MySQL的默认存储引擎是不支持事务的MyISAM时,锁表是一种控制对表的访问并确保可重复读取的方法。在MySQL的现代版本中,应该使用锁表的情况越来越少。实际上,您可能永远不需要使用锁表。
有关更多详细信息,请阅读https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
https://stackoverflow.com/questions/59889401
复制相似问题