我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

mysql事务中在innodb表中,使用rollback命令来回滚数据,使用commit命令来提交数据。只要是innodb表,第一次rollback就可以无视autocommmit设置无条件生效。那么,commit命令呢?和autocommit设置之间是什么关系。这就是本文要讨论的问题。

苏南大叔:mysql事务,如何理解commit提交操作的隐式和显式执行? - commit提交操作的隐式和显式执行
mysql事务,如何理解commit提交操作的隐式和显式执行?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码故事。本文测试环境:win10mysql@5.7.26mysql-front@5.3

前文回顾

如何设置autocommit自动提交选项?

如何理解rollback数据回滚?

从以前的文章里面,已经有了明显的结论:

  • 事务需要innodb引擎的表。
  • begin或者start transaction是开始标志。
  • commit是结束当前一轮事务的标志。
  • 开启autocommit在特定情况下会触发隐藏的commit操作。

龙套数据表

事务的开始和结束标志,都可以隐式调用的。commit之后就是一轮新的事务,会影响rollback数据回滚的范围。本文的例子还是对上一个rollback的文章进行改编。

龙套数据表如下:

DROP TABLE IF EXISTS `innodb`;
CREATE TABLE `innodb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `innodb` VALUES (1,'苏南大叔'),(2,'sunan大叔');

commit 显式执行

注意这里是关闭了autocommit

set autocommit = 0;
# 第一次
BEGIN;
delete from innodb;
rollback;
select * from innodb;

# 第二次主动commit
delete from innodb;
commit;
rollback;
select * from innodb;

可以看到:commit之后,数据就真删除了,无法rollback了。

苏南大叔:mysql事务,如何理解commit提交操作的隐式和显式执行? - 主动commit
mysql事务,如何理解commit提交操作的隐式和显式执行?(图3-2)

commit 隐式执行

注意这里开启了autocommit

set autocommit = 1;
# 第一次
BEGIN;
delete from innodb;
rollback;             # 这里就隐式的commit了
select * from innodb;

# 第二次隐式commit
delete from innodb;
rollback;
select * from innodb;

可以看到:隐式的commit之后,数据就真删除了。无法rollback了。

苏南大叔:mysql事务,如何理解commit提交操作的隐式和显式执行? - 隐式commit
mysql事务,如何理解commit提交操作的隐式和显式执行?(图3-3)

结语

写这么多技术总结也没有用,要看产出的。兄弟。更多mysql经验文章,请参考苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql