最近在看 《 MySQL 实战 45 讲》,然后同时找了本 《 MySQL 技术内幕:InnoDB 存储引擎》来看。
但是在谈到关于 autocommit
的使用时,两位作者给出的意见基本是完全相左的。
内幕建议使用 set autocommit = 0
:
使用自动提交是初级 DBA 容易犯的错误,在编写应用程序时,最好事务的控制权限交给开发人员,即在程序端进行事务的开始和结束,同时开发人员必须了解自动提交可能带来的问题。
实战建议使用 set autocommit = 1
;
因为如果
autocommit=0
则意味着只执行一个 select 语句也会启动对应的事务,而且不会自动提交。这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。
1
yaoliyc 2018-11-27 08:37:22 +08:00 via iPhone
根据实际场景取舍,感觉两条建议的目标人群是不是不一样。
|
2
kernel 2018-11-27 08:53:26 +08:00
第二点莫名奇妙,程序长时间不提交事务是要干嘛?
|
3
lancelee01 2018-11-27 09:07:04 +08:00
自动提交,那怎么加锁啊,for update 就完全没用了啊
|
4
youngster 2018-11-27 09:10:40 +08:00
自动提交啊,关键语句在使用 tran 控制事物,手动 commit 或 rollback
|
5
Muninn 2018-11-27 09:11:38 +08:00
一般都是开自动提交的
不建议的应该是书太老了吧 又不是开了就不能用事务了 |
6
mgcnrx11 2018-11-27 09:14:00 +08:00
实战建议开启 autocommit,应该是有个假设,就是代码里或运维时都 “忘了” 执行 commit/rollback 吧?实际上,commit/rollback 往往由框架可以帮忙处理(例如 Spring 事务管理),在此前提下,不建议开启自动提交了。
再说,如果有长连接,也可以在一个连接处理时分开多个事务提交,而不应该简单地说长连接就会导致长事务(长事务应尽量避免) |
7
keepeye 2018-11-27 09:28:04 +08:00
开啊,又不是开了就不能自己控制事务了,不冲突
|
8
klgd 2018-11-27 09:41:30 +08:00
默认是开着的
一般都是多条更新时手动开事务,然后 commit/rollback 单条 sql 都懒得写事务 |
9
aa6563679 2018-11-27 13:48:38 +08:00
在 Java 的 JDBC 里面,开启事务其实就是把自动提交关掉。。。
|
10
Exceptions 2018-11-27 17:06:14 +08:00
应该自动提交,mysql 默认的就是自动提交,每句 sql 都是默认都是一个事务,除非你显示的 begin 开启一个事务。
如果不默认提交,确实会像第二个作者所说的那样,这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。 |
11
wleexi 2018-11-27 17:25:50 +08:00
同是专栏的学习者。
我觉得都没毛病。看场景看需求。 |