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

话题还是有关mysql的数据回滚问题,在往期文章里,rollback的位置是begin,或者上一个commit动作。本文说的是通过定义savepoint来保存中间状态,然后再回滚数据到对应的位置。当然,这里也有不能回滚的情况,具体参考正文中的例子。

苏南大叔:mysql事务,如何设置使用状态保存点savepoint? - mysql-savepoint
mysql事务,如何设置使用状态保存点savepoint?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。测试环境:win10mysql@5.7.26mysql-front@5.3

前文回顾

rollback数据回滚的概念:

其主要影响因素是:

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;

苏南大叔:mysql事务,如何设置使用状态保存点savepoint? - savepoint例子
mysql事务,如何设置使用状态保存点savepoint?(图2-2)

执行效果说明:

  • 状态保存点3失败的原因,是被release释放了。
  • 状态保存点2失败的原因,是因为在其前面的s1点被回滚了,隐式释放了s2
  • 最后一个rollback成功的原因,是因为s1beign之后,beign状态没有被释放。

结语

不要期待事情总能后悔,自己要加油要努力!

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

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

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

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