首页   注册   登录
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
宝塔
V2EX  ›  MySQL

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

  •  
  •   banxi1988 · 357 天前 · 3274 次点击
    这是一个创建于 357 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 《 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
        1
    yaoliyc   357 天前 via iPhone
    根据实际场景取舍,感觉两条建议的目标人群是不是不一样。
        2
    kernel   357 天前
    第二点莫名奇妙,程序长时间不提交事务是要干嘛?
        3
    lancelee01   357 天前
    自动提交,那怎么加锁啊,for update 就完全没用了啊
        4
    youngster   357 天前
    自动提交啊,关键语句在使用 tran 控制事物,手动 commit 或 rollback
        5
    Muninn   357 天前
    一般都是开自动提交的

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

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

    再说,如果有长连接,也可以在一个连接处理时分开多个事务提交,而不应该简单地说长连接就会导致长事务(长事务应尽量避免)
        7
    keepeye   357 天前
    开啊,又不是开了就不能自己控制事务了,不冲突
        8
    klgd   357 天前
    默认是开着的
    一般都是多条更新时手动开事务,然后 commit/rollback
    单条 sql 都懒得写事务
        9
    aa6563679   357 天前
    在 Java 的 JDBC 里面,开启事务其实就是把自动提交关掉。。。
        10
    Exceptions   357 天前
    应该自动提交,mysql 默认的就是自动提交,每句 sql 都是默认都是一个事务,除非你显示的 begin 开启一个事务。
    如果不默认提交,确实会像第二个作者所说的那样,这个事件会持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。如果是长连接则会导致长事务,而长事件会占用回滚段和锁资源。
        11
    wleexi   357 天前
    同是专栏的学习者。
    我觉得都没毛病。看场景看需求。
        12
    duhuo   147 天前
    @kernel 应该是链接会话关闭了自动提交后,然后好多 sql 执行都在同一个会话里,如果没有主动提交或回滚的话,会导致会话中需要提交或回滚的执行语句太多,导致所描述的问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   976 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 19:57 · PVG 03:57 · LAX 11:57 · JFK 14:57
    ♥ Do have faith in what you're doing.