一、 MySQL innodb默认启用autocommit的优缺点
- 优点:
a) 避免执行SQL后没提交而导致其它会话看不到数据,甚至夯住;
b) 避免不可控的大事务发生;
c) 避免MySQL 5.7多线程并发复制时因主库某个SQL没有显性提交,导致从库其它线程一直等待提交,从而导致从库延迟越来越大,复制线程夯住,且故障原因很难排查;
d) 减少数据库异常宕机后,数据库recover的时间,减少数据丢失。 - 缺点:
在做变更时,执行的SQL语句会立刻生效,如有SQL语句变更错误,导致无法用rollback立刻回滚。
解决方案:
a) DBA在做变更时,先执行set autocommit=0; 将会话级的自动提交取消,检查变更条数与预期相同时再显式提交commit;
b) 程序中的简单事务可用begin显式开启,如:begin;SQL语句…;commit;或在程序中先执行set autocommit=0;待该事务commit提交完毕后再设置set autocommit=1;
c) 程序中如嵌套包含多个事务,可在程序中先执行set autocommit=0;待这些事务按预定的顺序commit提交完毕后再设置set autocommit=1。
二、 MySQL innodb关闭autocommit的优缺点 - 优点:
a) DBA在做变更时,如变更条数与预期不符方便用rollback回滚;
b) 程序中如嵌套包含多个事务时,可方便控制事务的提交顺序。 - 缺点:
a) 执行SQL后没提交会导致其它会话看不到数据,甚至夯住;
b) 可能会有不可控的大事务发生;
c) MySQL 5.7多线程并发复制时因主库某个SQL没有显性提交,导致从库其它线程一直等待提交,从而导致从库延迟越来越大,复制线程夯住,且故障原因很难排查;
d) 数据库异常宕机后,数据库recover的时间与数据的丢失量不可控,与最近一次commit有关。
e) 如执行了很多SQL后需要回滚,则回滚时间可能会很长,很可能导致数据库夯住。
通过以上内容的对比,显然开启自动提交autocommit更为合适。另外默认设置自动提交的数据库并非只有MySQL数据库,大名鼎鼎的SQLServer以及后来居上的PostgreSQL、GreenPlum数据库默认也都是自动提交。