zoukankan      html  css  js  c++  java
  • 事务的保存点

    一、什么是保存点

    如果开启了一个事务,并且已经输入了很多的语句时,如果忽然发现上一条语句有问题,可以用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保存点后,后面的保存点就不存在了,自动被删除了。

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    HDU 3547 DIY Cube
    POJ 2975 Nim
    POJ 1678 I Love this Game!
    POJ 2234 Matches Game
    POJ 3537 Crosses and Crosses
    POJ 3710 Christmas Game
    POJ 1704 Georgia and Bob
    HDU 3923 Invoker
    POJ 2154 Color
    PLM更新自定义CLASS
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14966088.html
Copyright © 2011-2022 走看看