事务与 autocommit ,到底应不应该开启自动提交?

2018-11-27 08:12:53 +08:00
 banxi1988

最近在看 《 MySQL 实战 45 讲》,然后同时找了本 《 MySQL 技术内幕:InnoDB 存储引擎》来看。 但是在谈到关于 autocommit 的使用时,两位作者给出的意见基本是完全相左的。

内幕建议使用 set autocommit = 0:

使用自动提交是初级 DBA 容易犯的错误,在编写应用程序时,最好事务的控制权限交给开发人员,即在程序端进行事务的开始和结束,同时开发人员必须了解自动提交可能带来的问题。

实战建议使用 set autocommit = 1;

因为如果 autocommit=0 则意味着只执行一个 select 语句也会启动对应的事务,而且不会自动提交。这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。

6673 次点击
所在节点    MySQL
12 条回复
yaoliyc
2018-11-27 08:37:22 +08:00
根据实际场景取舍,感觉两条建议的目标人群是不是不一样。
kernel
2018-11-27 08:53:26 +08:00
第二点莫名奇妙,程序长时间不提交事务是要干嘛?
lancelee01
2018-11-27 09:07:04 +08:00
自动提交,那怎么加锁啊,for update 就完全没用了啊
youngster
2018-11-27 09:10:40 +08:00
自动提交啊,关键语句在使用 tran 控制事物,手动 commit 或 rollback
Muninn
2018-11-27 09:11:38 +08:00
一般都是开自动提交的

不建议的应该是书太老了吧

又不是开了就不能用事务了
mgcnrx11
2018-11-27 09:14:00 +08:00
实战建议开启 autocommit,应该是有个假设,就是代码里或运维时都 “忘了” 执行 commit/rollback 吧?实际上,commit/rollback 往往由框架可以帮忙处理(例如 Spring 事务管理),在此前提下,不建议开启自动提交了。

再说,如果有长连接,也可以在一个连接处理时分开多个事务提交,而不应该简单地说长连接就会导致长事务(长事务应尽量避免)
keepeye
2018-11-27 09:28:04 +08:00
开啊,又不是开了就不能自己控制事务了,不冲突
klgd
2018-11-27 09:41:30 +08:00
默认是开着的
一般都是多条更新时手动开事务,然后 commit/rollback
单条 sql 都懒得写事务
aa6563679
2018-11-27 13:48:38 +08:00
在 Java 的 JDBC 里面,开启事务其实就是把自动提交关掉。。。
Exceptions
2018-11-27 17:06:14 +08:00
应该自动提交,mysql 默认的就是自动提交,每句 sql 都是默认都是一个事务,除非你显示的 begin 开启一个事务。
如果不默认提交,确实会像第二个作者所说的那样,这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。
wleexi
2018-11-27 17:25:50 +08:00
同是专栏的学习者。
我觉得都没毛病。看场景看需求。
duhuo
2019-06-25 18:51:21 +08:00
@kernel 应该是链接会话关闭了自动提交后,然后好多 sql 执行都在同一个会话里,如果没有主动提交或回滚的话,会导致会话中需要提交或回滚的执行语句太多,导致所描述的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/511788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX