mysql事务,如何设置使用状态保存点savepoint?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
话题还是有关mysql
的数据回滚问题,在往期文章里,rollback
的位置是begin
,或者上一个commit
动作。本文说的是通过定义savepoint
来保存中间状态,然后再回滚数据到对应的位置。当然,这里也有不能回滚的情况,具体参考正文中的例子。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。测试环境:win10
,mysql@5.7.26
,mysql-front@5.3
。
前文回顾
rollback
数据回滚的概念:
其主要影响因素是:
innodb
数据表,https://newsn.net/say/mysql-engines.htmlautocommit
属性,https://newsn.net/say/mysql-autocommit.htmlcommit
动作,https://newsn.net/say/mysql-commit.html- 事务开始的位置,(记忆点开始的位置),https://newsn.net/say/mysql-savepoint.html
savepoint
定义一个状态保存点:
savepoint <pointname>
回滚到某个状态保存点:
rollback to <pointname>
释放某个状态保存点:
release savepoint <pointname>
测试例子
还是使用原来文章里面的例子,只不过数据是单独插入的重点,每条数据插入完成后,都设置一个状态保存点。
定义数据表:
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;
定义保存点:
begin;
INSERT INTO `innodb` VALUES (1,'苏南大叔');
savepoint s1;
INSERT INTO `innodb` VALUES (2,'sunan大叔');
savepoint s2;
INSERT INTO `innodb` VALUES (3,'uncle sunan');
savepoint s3;
update `innodb` set name='大叔苏南' where id=3;
进行回滚操作:
release savepoint s3;
# rollback to s3; # 失败 错误提示 savepoint s3 does not exist
select * from innodb;
rollback to s1; # 成功恢复到一条数据的状态
select * from innodb;
# rollback to s2; # 失败 错误提示 savepoint s3 does not exist
rollback; # 成功恢复到初始状态
select * from innodb;
执行效果说明:
- 状态保存点3失败的原因,是被
release
释放了。 - 状态保存点2失败的原因,是因为在其前面的
s1
点被回滚了,隐式释放了s2
。 - 最后一个
rollback
成功的原因,是因为s1
在beign
之后,beign
状态没有被释放。
结语
不要期待事情总能后悔,自己要加油要努力!
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。