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状态没有被释放。
结语
不要期待事情总能后悔,自己要加油要努力!