首先描述一下这个参数的作用。
这个参数 默认是开启的。 开启以后再命令敲的sql 会自动提交。如果关闭,就必须手动 commit。
查看 这个 自动提交状态。
SELECT @@autocommit;
零时修改这个素心
set @@autocimmit = 1;
全局修改:可以改 mysql.cnf(linux ) 或者 mysql.ini(window) 文件
修改 以后 直接在命令行 写sql 无效了
需要这么写:
开启以后,会强制要求 提交
在事物环境中 提交一次,能提高执行效率。但是 这样写 不管在开没开启自动提交效率都 一样,比单条提交效率高。只是 关闭后单条 提交被禁用,或者说因为没有个每一条 sql 一个事物环境,所以不允许执行 没有手动提交的 单条sql。
结论:autocimmit = 0 ,不允许自动提交,不会在命令行 执行的每一条 sql 的同时,commit 一次。这样就强制 命令行 写入数据必须开启 一个 事物,然后执行 sql 以后 手动 提交。从而避免了命令行 方式的 大量 单条sql 执行 慢 的问题。
备注:自动提交的 批量单条sql 执行,这时候每一个sql 是独立提交的。所以 异常不能 ,也不会 全部回滚。
然后在说说 spring 里面男的 autocimmit = 0 对 spring 事物的影响。
首先,spring 默认会设置当前连接 autocimmit =1.
如图:在mysql 全局 关闭 自动提交的 情况下,获取spring的 自动提交。是true;
这也是为什么 数据库关闭自动提交 后 spring 没有写 @Transactional 的方法里面的 修改语句 也会被提交。
如果 数据库的 autocimmit =0 ,并且管理spring里面默认修改的 自动提交(dmg.getDataSource().getConnection().setAutoCommit(false); ),那么 sql 就不会自动提交了。这时候 插入语句无效。
关于 spring 没有写 @Transactional 的解释:
数据库 提交有 2 中方式:
1 单行提交,
2 提交同一个事物的多行代码
不写 @Transactional 就是 单行提交。