首先描述一下这个参数的作用。

  这个参数 默认是开启的。 开启以后再命令敲的sql 会自动提交。如果关闭,就必须手动 commit。

 

查看 这个 自动提交状态。

  SELECT @@autocommit;

关于mysql 的 autoCommit 参数_sql

 

零时修改这个素心

  set @@autocimmit = 1;

 

关于mysql 的 autoCommit 参数_sql_02

全局修改:可以改 mysql.cnf(linux ) 或者 mysql.ini(window) 文件

 

关于mysql 的 autoCommit 参数_ci_03

 

 

 修改 以后 直接在命令行 写sql  无效了

关于mysql 的 autoCommit 参数_ci_04

 

 

 

 需要这么写:

关于mysql 的 autoCommit 参数_spring_05

 

 

开启以后,会强制要求 提交

 

关于mysql 的 autoCommit 参数_spring_06

 

 在事物环境中 提交一次,能提高执行效率。但是 这样写 不管在开没开启自动提交效率都 一样,比单条提交效率高。只是 关闭后单条 提交被禁用,或者说因为没有个每一条 sql  一个事物环境,所以不允许执行 没有手动提交的 单条sql。

关于mysql 的 autoCommit 参数_spring_07

 

 

结论:autocimmit = 0 ,不允许自动提交,不会在命令行 执行的每一条 sql 的同时,commit 一次。这样就强制 命令行 写入数据必须开启 一个 事物,然后执行 sql  以后 手动 提交。从而避免了命令行 方式的 大量 单条sql 执行 慢 的问题。

 

备注:自动提交的 批量单条sql 执行,这时候每一个sql 是独立提交的。所以 异常不能 ,也不会 全部回滚。

 

然后在说说   spring  里面男的 autocimmit = 0 对 spring 事物的影响。

 

首先,spring 默认会设置当前连接 autocimmit =1.

如图:在mysql  全局 关闭 自动提交的 情况下,获取spring的 自动提交。是true;

关于mysql 的 autoCommit 参数_sql_08

 

 这也是为什么 数据库关闭自动提交 后 spring 没有写 @Transactional 的方法里面的 修改语句 也会被提交。

 

如果 数据库的 autocimmit =0 ,并且管理spring里面默认修改的 自动提交(dmg.getDataSource().getConnection().setAutoCommit(false);  ),那么 sql 就不会自动提交了。这时候 插入语句无效。

 

关于 spring 没有写  @Transactional 的解释:

  数据库 提交有 2 中方式:

    1 单行提交,

    2 提交同一个事物的多行代码

 

不写  @Transactional 就是 单行提交。