ROLLBACK TO SAVEPOINT
ROLLBACK TO SAVEPOINT¶
将当前事务回滚到保存点。
- 语法
-
``` sql ROLLBACK [WORK | TRANSACTION] TO [SAVEPOINT] savepoint_name
```
- 描述
-
此命令将回滚在建立保存点之后执行的所有命令。 该保存点保持有效,可以稍后在需要时回滚。
ROLLBACK TO SAVEPOINT
隐式销毁在指定保存点之后建立的所有保存点。 - 参数
-
该SQL命令参数说明见下
WORK
|TRANSACTION
- 可选关键字。它们没有作用。
savepoint_name
- 要回滚的保存点的名称。
- 注解
-
使用
RELEASE SAVEPOINT
销毁一个保存点,而不会丢弃建立该保存点后执行的命令的效果。指定尚未建立的保存点名称是错误的。
游标相对于保存点具有某种非事务性的行为。 当回滚保存点时,在保存点内部打开的所有游标都将关闭。如果先前打开的游标受保存点内的
FETCH
命令影响,该保存点随后被回滚,则该游标仍将保持在FETCH
指向的位置(即,由FETCH
引起的光标运动不会回滚)。关闭游标也不会通过回滚来撤消。 但是,如果游标的查询所引起的其他副作用(例如查询所调用的volatile函数的副作用)在保存点期间发生,然后又回滚,则这些副作用也会被回滚。 由于其执行导致事务中止的游标处于无法执行状态, 因此尽管可以使用ROLLBACK TO SAVEPOINT
还原该事务,但不能再使用该游标。 - 示例
-
要撤消在建立
my_savepoint
之后执行的命令的影响:ROLLBACK TO SAVEPOINT my_savepoint;
光标位置不受保存点回滚的影响:
BEGIN; DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2; SAVEPOINT foo; FETCH 1 FROM foo; column ---------- 1 ROLLBACK TO SAVEPOINT foo; FETCH 1 FROM foo; column ---------- 2 COMMIT;
- 兼容性说明
- SQL标准指定关键字
SAVEPOINT
是必需的,但是SeaboxMPP数据库(和Oracle)允许省略它。SQL在ROLLBACK
之后只允许WORK
,而不允许TRANSACTION
作为干扰词。此外,SQL具有可选子句AND [NO] CHAIN
,SeaboxMPP数据库当前不支持该子句。在其他方面,此命令符合SQL标准。 - 相关SQL命令
BEGIN
,COMMIT
,SAVEPOINT
,RELEASE SAVEPOINT
,ROLLBACK