Small. Fast. Reliable.
Choose any three.
保存点

1.语法

savepoint-stmt:

SAVEPOINT savepoint-name

release-stmt:

RELEASE SAVEPOINT savepoint-name

rollback-stmt:

ROLLBACK TRANSACTION TO SAVEPOINT savepoint-name

2.保存点

SAVEPOINT是一种创建事务的方法,类似于 BEGINCOMMIT,只是SAVEPOINT和RELEASE命令被命名并且可以嵌套。

SAVEPOINT命令启动一个具有名称的新事务。事务名称不必唯一。可以在BEGIN ... COMMIT的内部或外部启动SAVEPOINT 。当SAVEPOINT是最外面的保存点并且不在BEGIN ... COMMIT内时,其行为与BEGIN DEFERRED TRANSACTION相同。

ROLLBACK TO命令将数据库的状态恢复到相应的SAVEPOINT之后的状态。请注意,与普通的ROLLBACK命令(没有TO关键字)不同,ROLLBACK TO命令不会取消事务。ROLLBACK TO命令没有取消事务,而是从头开始重新启动事务。但是,所有中间的SAVEPOINT都被取消。

RELEASE命令就像一个SAVEPOINT的COMMIT。RELEASE命令导致所有返回到并包括名称匹配的最新保存点的保存点(包括与之匹配的所有保存点)从事务堆栈中删除。内部事务的释放不会导致将任何更改写入数据库文件。它仅从事务堆栈中删除保存点,从而不再可能回滚到这些保存点。如果RELEASE命令释放最外面的保存点,从而使事务堆栈为空,则RELEASE与COMMIT相同。该COMMIT命令可以用来释放所有保存点和提交事务,即使该交易最初是由一个SAVEPOINT命令,而不是一个开始BEGIN 命令。

如果RELEASE命令中的savepoint-name与当前事务堆栈中的任何保存点都不匹配,则不释放任何保存点,数据库不变,并且RELEASE命令返回错误。

请注意,内部事务可能会提交(使用RELEASE命令),但随后在外部事务中通过ROLLBACK撤消其工作。电源故障,程序崩溃或操作系统崩溃将导致最外部的事务回滚,从而撤消该外部事务中发生的所有更改,甚至撤消RELEASE命令据称已“提交”的更改。直到最外面的事务提交,内容才真正提交到磁盘上。

有几种关于RELEASE命令的思考方式:

3.交易嵌套规则

最后启动的事务将是第一个提交或回滚的事务。

仅当事务堆栈为空时,换句话说,如果没有挂起的事务,BEGIN命令才起作用。如果在调用BEGIN命令时事务堆栈不为空,则该命令将失败并显示错误。

COMMIT命令提交所有未完成的事务和树叶的交易栈空。

RELEASE命令从事务堆栈的最新添加项开始,并向后及时释放保存点,直到它释放具有匹配保存点名称的保存点为止。先前的保存点,甚至具有匹配的保存点名称的保存点也不会更改。如果RELEASE命令导致事务堆栈变空(如果RELEASE命令从堆栈中释放最外面的事务),则提交事务。

不带TO子句的ROLLBACK命令将回滚所有事务,并使事务堆栈为空。

带有TO子句的ROLLBACK命令将事务倒退到具有匹配名称的最新SAVEPOINT,并在时间上向后退。具有匹配名称的SAVEPOINT保留在事务堆栈上,但是创建该SAVEPOINT之后发生的所有数据库更改都将回滚。如果ROLLBACK TO命令中的savepoint-name与堆栈上的任何SAVEPOINT不匹配,则ROLLBACK命令失败并显示错误,并且数据库状态保持不变。