1语法
保存点-状态:
发布-测试:
回滚-状态:
2保存点
SAVEPOINT是一种创建事务的方法,类似于开始和承诺,但SAVEPOINT和RELEASE命令除外命名并可以嵌套。
SAVEPOINT命令使用名称启动新事务。事务名称不必唯一。SAVEPOINT可以在一开始。。。承诺。当SAVEPOINT是最外层的保存点时它不在开始。。。承诺那么行为就是与开始延迟事务相同。
ROLLBACK TO命令将数据库的状态恢复为就在相应的SAVEPOINT之后。注意,与此不同平原回降命令(不带TO关键字)ROLLBACK TO命令不会取消交易。不是取消交易,ROLLBACK TO命令在开始时重新启动事务。但是,所有干预的SAVEPOINT都会被取消。
RELEASE命令类似于承诺用于SAVEPOINT。RELEASE命令会使所有保存点返回并包括具有要从中删除的匹配名称的最新保存点事务堆栈。内部事务的释放不会导致任何更改写入数据库文件;它只是从事务堆栈中删除保存点,以便不再可能回滚到这些保存点。如果RELEASE命令释放最外层的保存点,那么事务堆栈变空,则RELEASE相同作为承诺.这个承诺命令可用于释放所有保存点和即使事务最初启动,也要提交事务通过SAVEPOINT命令而不是开始命令。
如果RELEASE命令中的保存点名称与保存点当前位于事务堆栈中,则没有保存点释放后,数据库保持不变,RELEASE命令返回一个错误。
注意,内部事务可能会提交(使用RELEASE命令)但稍后会通过外部事务中的ROLLBACK取消其工作。电源故障、程序崩溃或操作系统崩溃将导致最外层的事务回滚,撤消在中发生的所有更改外部事务,甚至应该“提交”的更改通过RELEASE命令。内容实际上没有提交到磁盘上直到最外层的事务提交。
有几种方式可以考虑RELEASE命令:
有些人认为RELEASE等同于SAVEPOINT的COMMIT。只要记住内部事务提交的更改稍后可能会被在外部事务中回滚。
RELEASE的另一个视图是它将命名事务合并到父事务,以便指定的事务及其父事务成为相同的事务。RELEASE之后,命名事务及其父级将一起提交或回滚,无论其命运如何。
还可以将保存点视为交易时间线中的“标记”。在此视图中,SAVEPOINT命令创建一个新标记,ROLLBACK TO命令将时间轴倒回指向命名标记后的点,然后使用RELEASE命令删除时间轴上的标记,而不实际制作任何标记对数据库的更改。
3事务嵌套规则
最后启动的事务将是第一个事务已提交或回滚。
这个开始命令仅在事务堆栈为空时有效,或换句话说,如果没有挂起的事务。如果交易当开始命令被调用,然后该命令失败并出现错误。
这个承诺command提交所有未完成的事务并离开事务堆栈为空。
RELEASE命令从最近添加到事务堆栈并向后释放保存点直到它释放具有匹配的保存点名称的保存点。以前的保存点,甚至具有匹配保存点名称的保存点都是保持不变。如果RELEASE命令导致事务堆栈变空(如果RELEASE命令释放堆栈中最外层的事务),然后提交事务。
这个回降不带TO子句的命令回滚所有事务并使事务堆栈为空。
带有TO子句的ROLLBACK命令回滚正在进行的事务在时间上向后返回到具有匹配名称的最新SAVEPOINT。具有匹配名称的SAVEPOINT仍保留在事务堆栈中,但创建SAVEPOINT后发生的所有数据库更改已回滚。如果ROLLBACK TO命令中的保存点名称没有匹配堆栈上的任何SAVEPOINT,则ROLLBACK命令失败,并返回错误并保持数据库状态不变。