===================== ROLLBACK TO SAVEPOINT ===================== .. container:: refentry :name: SQL-ROLLBACK-TO .. container:: titlepage .. container:: refnamediv .. rubric:: ROLLBACK TO SAVEPOINT :name: rollback-to-savepoint ROLLBACK TO SAVEPOINT — 回滚到一个保存点 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name .. container:: refsect1 :name: id-1.9.3.168.6 .. rubric:: 描述 :name: 描述 回滚在该保存点被建立之后执行的所有命令。该保存点保持有效并且可以在 以后再次回滚到它(如果需要)。 ``ROLLBACK TO SAVEPOINT``\ 隐式地销毁在所提及的保存点 之后建立的所有保存点。 .. container:: refsect1 :name: id-1.9.3.168.7 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``savepoint_name``* 要回滚到的保存点。 .. container:: refsect1 :name: id-1.9.3.168.8 .. rubric:: 注解 :name: 注解 使用\ `RELEASE SAVEPOINT `__\ 销毁一个保存点而 不抛弃在它建立之后被执行的命令的效果。 指定一个没有被建立的保存点是一种错误。 相对于保存点,游标有一点非事务的行为。在保存点被回滚时,任何在该保存点 内被打开的游标将会被关闭。如果一个先前打开的游标在一个保存点内被 ``FETCH``\ 或\ ``MOVE``\ 命令所影响,而该该保存点 后来又被回滚,那么该游标将保持\ ``FETCH``\ 使它指向的位置(也 就是说由\ ``FETCH``\ 导致的游标动作不会被回滚)。回滚也不能 撤销关闭一个游标。不过,其他由游标查询导致的副作用(例如 被该查询所调用的易变函数的副作用) *可以*\ 被回滚,只要它们发生在一个后来被回滚的保存点期间。 如果一个游标的执行导致事务中止,它会被置于一种不能被执行的状态,这样当 事务被用\ ``ROLLBACK TO SAVEPOINT``\ 恢复后,该游标也不再能 被使用。 .. container:: refsect1 :name: id-1.9.3.168.9 .. rubric:: 示例 :name: 示例 要撤销在\ ``my_savepoint``\ 建立后执行的命令的效果: .. code:: programlisting ROLLBACK TO SAVEPOINT my_savepoint; 游标位置不会受保存点回滚的影响: .. code:: programlisting 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; .. container:: refsect1 :name: id-1.9.3.168.10 .. rubric:: 兼容性 :name: 兼容性 SQL标准指定关键词 ``SAVEPOINT``\ 是强制的,但是 OushuDB 和Oracle允许省略它。SQL 只允许\ ``WORK``\ 而 不是\ ``TRANSACTION``\ 作为\ ``ROLLBACK``\ 之后的噪声词。 还有,SQL 有一个可选的子句 ``AND [ NO ] CHAIN``\ ,当前 OushuDB 并不支持。在其他方面,这个命令符合 SQL 标准。 .. container:: refsect1 :name: id-1.9.3.168.11 .. rubric:: 另见 :name: 另见 `BEGIN `__, `COMMIT `__, `RELEASE SAVEPOINT `__, `ROLLBACK `__, `SAVEPOINT `__