› 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 · Nov 27, 2018 · 7623 views
    This topic created in 2862 days ago, the information mentioned may be changed or developed.

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

    内幕建议使用 set autocommit = 0:

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

    实战建议使用 set autocommit = 1;

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

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

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

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

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