首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BEGIN...COMMIT与锁表

BEGIN...COMMIT与锁表
EN

Stack Overflow用户
提问于 2020-01-24 09:45:37
回答 1查看 122关注 0票数 1

下面两组语句的区别是什么?

代码语言:javascript
运行
复制
BEGIN;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;

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

他们会做同样的事情吗?如果不是,为什么要使用一个而不是另一个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59889401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档