MySQL中innodb的锁

发布于 2022-09-12 02:14:12 字数 82 浏览 52 评论 0

请问innodb引擎中,当使用update或者insert或者delete语句时,如果没有声明事务的话,数据库会给影响的行加锁么?具体机制是怎么样的?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

半边脸i 2022-09-19 02:14:13

innodb中不存在你说的情况。可见官方文档说明:

In InnoDB, all user activity occurs inside a transaction.

也就是说,在innodb中,你的语句肯定在事务中。可分为如下几种情况:

  1. 显示声明事务: begin or start transaction

    当显示的声明事务就会隐式的关闭了自动提交,参见官方文档

  2. 未显示声明事务 & set autocommit=1 : 每一条sql就会是一个事务。
  3. 未显示声明事务 & set autocommit=0 : 连接中的事务总是处于打开状态,当commit或者rollback时事务完成并开启一个新事务。
德意的啸 2022-09-19 02:14:13

只要你执行update、delete,任何DML,都会有行锁。
区别在于你的实例是否自动提交,即看autocommit是怎么设置的
1.autocommit=1,当你执行update时,加行锁,语句执行完了,事务就自动提交,那么行锁也就释放了;
2.autocommit=0,当你执行update时,加行锁,语句执行完了,如果不commit,也不rollback,那么行锁将一直持续到你结束事务为止。

妄想挽回 2022-09-19 02:14:13

行级锁只对索引有效,没索引直接表锁。

另外“行级锁”不一定只有一行。

半边脸i 2022-09-19 02:14:13

事务本身和锁没有任何关系啊...
锁是语句行为,只不过在事务里锁要等事务提交才会释放而不是语句结束就释放

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文