关于mysql的参数autocommit

背景知识:

  1. mysql事务支持的引擎是InnoDB
  2. 默认情况下autocommit的值为1

1.首先准备一张innodb引擎的测试表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL
) ENGINE=InnoDB;
INSERT INTO `test` VALUES ('1');
INSERT INTO `test` VALUES ('3');
INSERT INTO `test` VALUES ('5');

2.执行如下命令可以发现mysql的autocommit默认值是ON,也就是开启状态:

关于mysql的参数autocommit_第1张图片

3. 当autocommit为开启状态时,即使没有手动start transaction开启事务,mysql默认也会将用户的操作当做事务即时提交。怎么理解呢?例如,你执行了insert into test values(2)语句,mysql默认会帮你开启事务,并且在这条插入语句执行完成之后,默认帮你提交事务。这时候可能有人会问了,那如果我手动开启了事务呢?例如如下操作,开启事务并插入两条数据:

关于mysql的参数autocommit_第2张图片

由于A客户端没有提交,因此如果我们用B客户端去查询数据,会发现新插入的数据并没有被查询到:

关于mysql的参数autocommit_第3张图片

当我们把A客户端的事务提交了之后,B客户端就能查询到新增加的数据了:

关于mysql的参数autocommit_第4张图片

从上述的操作中我们可以明白,当autocommit为ON的情况下,并且又手动开启了事务,那么mysql会把start transaction 与 commit之间的语句当做一次事务来处理,默认并不会帮用户提交需要手动提交,如果用户不提交便退出了,那么事务将回滚。

4.如果我们将autocommit设置为OFF,如下:

关于mysql的参数autocommit_第5张图片

那么系统仍然会自动开启事务,但是需要用户手动提交:

关于mysql的参数autocommit_第6张图片

这时候,用客户端B去查询数据,你会发现,新增加的4记录没有被查询到:

关于mysql的参数autocommit_第7张图片

原因就在于,将autocommit设置为OFF之后,系统默认开始了事务,但是并没有默认帮你提交了事务,因此如果我们在A客户端执行commit之后,B客户端就能查询到新的数据:

关于mysql的参数autocommit_第8张图片

关于mysql的参数autocommit_第9张图片

5.以上就是autocommit参数的详细解释了。

最后欢迎大家关注我的公众号:

关于mysql的参数autocommit_第10张图片

你可能感兴趣的:(Mysql)