简单介绍下autocommit参数,下文内容只在Innodb引擎下有效,因为Innodb支持事务,MyISAM不支持
环境:mysql8(innodb),mac M1

一、autocommit参数是一个客户端参数,或者说是连接参数。

为了演示autocommit参数的效果,这里创建两个连接,两个连接的是我本地的同一个数据库,只是连接名不同。

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_mysql


mysql internal_tmp_mem_storage_engine参数详解 mysql-common_database_02



1、查询当前连接的autocommit参数

show variables like "autocommit"

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_数据_03


另一个连接的autocommit的值也是ON,因为默认是ON


2、修改当前连接的autocommit参数

## 其中0=OFF,1=ON
set autocommit = 0

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_数据_04

再查一下mysql2连接的autocommit

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_database_05


可以看出autocommit是属于连接的参数,不是数据库参数。每个连接各有一个autocommit参数。


二、autocommit参数的作用

autocommit:自动提交。提交指的是事务提交,顾名思义,当开启自动提交之后,你的每一次sql执行都会立马作为一个事务提交。如果关闭自动提交,你执行的sql都不会生效,除非你手动执行commit

示例
就不用navicat来演示了,因为navicat好像会隐式的在每一次执行的最后加一个commit。我没找到在哪里关闭这个功能。。。。
所以直接用命令行演示。

1、开启一个连接,并设置autocommit参数为OFF,然后执行一条插入语句,发现表里有数据。但这时数据并没有真正的插入到表里,只有当手动输入commit之后,数据才会真正写入表里。

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_database_06

2、开启另一个连接来检查刚刚的insert操作。确实是查不到数据。

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_数据库_07

3、用第一个连接,执行一次commit

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_数据_08

4、第二个连接再次查询,发现数据写入。

mysql internal_tmp_mem_storage_engine参数详解 mysql-common_mysql_09

5、我就不演示autocommit为ON的情况了,默认就是ON,大家平时用的应该也是ON。