V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
banxi1988
V2EX  ›  MySQL

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

  •  
  •   banxi1988 ·
    banxi1988 · 2018-11-27 08:12:53 +08:00 · 6658 次点击
    这是一个创建于 2180 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    内幕建议使用 set autocommit = 0:

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

    实战建议使用 set autocommit = 1;

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

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

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

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

    再说,如果有长连接,也可以在一个连接处理时分开多个事务提交,而不应该简单地说长连接就会导致长事务(长事务应尽量避免)
    keepeye
        7
    keepeye  
       2018-11-27 09:28:04 +08:00
    开啊,又不是开了就不能自己控制事务了,不冲突
    klgd
        8
    klgd  
       2018-11-27 09:41:30 +08:00
    默认是开着的
    一般都是多条更新时手动开事务,然后 commit/rollback
    单条 sql 都懒得写事务
    aa6563679
        9
    aa6563679  
       2018-11-27 13:48:38 +08:00
    在 Java 的 JDBC 里面,开启事务其实就是把自动提交关掉。。。
    Exceptions
        10
    Exceptions  
       2018-11-27 17:06:14 +08:00
    应该自动提交,mysql 默认的就是自动提交,每句 sql 都是默认都是一个事务,除非你显示的 begin 开启一个事务。
    如果不默认提交,确实会像第二个作者所说的那样,这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。
    wleexi
        11
    wleexi  
       2018-11-27 17:25:50 +08:00
    同是专栏的学习者。
    我觉得都没毛病。看场景看需求。
    duhuo
        12
    duhuo  
       2019-06-25 18:51:21 +08:00
    @kernel 应该是链接会话关闭了自动提交后,然后好多 sql 执行都在同一个会话里,如果没有主动提交或回滚的话,会导致会话中需要提交或回滚的执行语句太多,导致所描述的问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5518 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:28 · PVG 09:28 · LAX 17:28 · JFK 20:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.