事务的保存点

一、什么是保存点

如果开启了一个事务,并且已经输入了很多的语句时,如果忽然发现上一条语句有问题,可以用rollback语句来让数据库状态恢复到事务执行之前的样子,然后一切再重来。因为这个问题,MySQL提出了一个保存点savepoint的概念,就是在事务对应的数据库语句中打几个点,我们调用rollback语句时能指定回滚到哪个点,而不是最初的原点。

二、定义保存点

定义保存点的语法:save point 保存点名称;

注意如果当前事务有一个同样名称的保存点,则旧的保存点被删除,新的保存点被设置。

三、回滚到指定保存点

当想回滚到某个保存点的时候,可以使用如下语句:Rollback [work] to [savepoint] 保存点名称;

注意

(1)work、savepoint不是必须填写的,可以省略

(2)rollback语句后边不跟随保存点名称的话,会直接回滚到事务执行之前的状态。

(3)rollback是我们手动去回滚事务时才使用的,如果事务在执行过程中遇到某些错误而无法执行的话,事务自身会自动回滚。

四、删除保存点

删除保存点,使用语句:Release savepoint 保存点名称

注意

1、InnoDB 不会释放被存储在保存点之后的存储器中的行锁定。

2、如果执行 COMMIT 或 ROLLBACK,则当前事务的所有保存点被删除。

例1:直接使用rollback回滚

查询sc表所有学生数据

select *

from sc

删除所有性别为女的数据

delete

from sc

where ssex='女'

删除以后重新查询sc表数据没有女生

select *

from sc

执行rollback回滚

再次查询sc表所有学生数据,恢复数据

select *

from sc

例2:使用保存点回滚

操作前先查询sc表数据

将李君同学的班级号修改为95032

update sc

set class ='95032'

where sname ='李君'

查询李君同学的信息:

select *

from sc

where sname ='李君'

查询所有的sc表数据:

删除陆仪同学记录

delete

from sc

where sname='陆仪'

 删除成功后,查看sc表数据

设置保存点1:test1152

SAVEPOINT test1152

再添加一条记录到sc中

insert into sc values('105' , '赵享' ,'男' ,'1995-01-01' , '95033',200)

设置保存点2:test1158

SAVEPOINT test1158

Rollback work to savepoint test1152

回滚到指定保存点test1152后,查看sc表数据,此时发现已经sc的数据已经回滚到删除陆仪同学后,即保存点“ test1152”之后的数据不再恢复,回到保存点“ test1152”之前的数据。

此时还能回滚到test1158保存点吗?不能。

因为test1158是在回滚点test1152之后设置的,所以回滚到前面test1152保存点后,后面的保存点就不存在了,自动被删除了。

欢迎批评指正,提出问题,谢谢!
原文地址:https://www.cnblogs.com/xxeleanor/p/14966088.html