autocommit
背景知识:
- mysql事务支持的引擎是InnoDB
- 默认情况下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,也就是开启状态:
3. 当autocommit为开启状态时,即使没有手动start transaction开启事务,mysql默认也会将用户的操作当做事务即时提交。怎么理解呢?例如,你执行了insert into test values(2)语句,mysql默认会帮你开启事务,并且在这条插入语句执行完成之后,默认帮你提交事务。这时候可能有人会问了,那如果我手动开启了事务呢?例如如下操作,开启事务并插入两条数据:
由于A客户端没有提交,因此如果我们用B客户端去查询数据,会发现新插入的数据并没有被查询到:
当我们把A客户端的事务提交了之后,B客户端就能查询到新增加的数据了:
从上述的操作中我们可以明白,当autocommit为ON的情况下,并且又手动开启了事务,那么mysql会把start transaction 与 commit之间的语句当做一次事务来处理,默认并不会帮用户提交需要手动提交,如果用户不提交便退出了,那么事务将回滚。
4.如果我们将autocommit设置为OFF,如下:
那么系统仍然会自动开启事务,但是需要用户手动提交:
这时候,用客户端B去查询数据,你会发现,新增加的4记录没有被查询到:
原因就在于,将autocommit设置为OFF之后,系统默认开始了事务,但是并没有默认帮你提交了事务,因此如果我们在A客户端执行commit之后,B客户端就能查询到新的数据:
API函数
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
描述
- 如果模式为“1”,启用autocommit模式;如果模式为“0”,禁止autocommit模式。
返回值
- 如果成功,返回0,如果出现错误,返回非0值。
错误
- 无。