mysql事务,如何理解commit提交操作的隐式和显式执行?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
mysql
事务中在innodb
表中,使用rollback
命令来回滚数据,使用commit
命令来提交数据。只要是innodb
表,第一次rollback
就可以无视autocommmit
设置无条件生效。那么,commit
命令呢?和autocommit
设置之间是什么关系。这就是本文要讨论的问题。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码故事。本文测试环境:win10
,mysql@5.7.26
,mysql-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
了。
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
经验文章,请参考苏南大叔的博客:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。