========= SAVEPOINT ========= .. container:: refentry :name: SQL-SAVEPOINT .. container:: titlepage .. container:: refnamediv .. rubric:: SAVEPOINT :name: savepoint SAVEPOINT — 在当前事务中定义一个新的保存点 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis SAVEPOINT savepoint_name .. container:: refsect1 :name: id-1.9.3.169.6 .. rubric:: 描述 :name: 描述 ``SAVEPOINT``\ 在当前事务中建立一个新保存点。 保存点是事务内的一种特殊标记,它允许所有在它被建立之后执行的命令被 回滚,把该事务的状态恢复到它处于保存点时的样子。 .. container:: refsect1 :name: id-1.9.3.169.7 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``savepoint_name``* 给新保存点的名字。 .. container:: refsect1 :name: id-1.9.3.169.8 .. rubric:: 注解 :name: 注解 使用\ `ROLLBACK TO SAVEPOINT `__\ 回滚到一个保存点。 使用\ `RELEASE SAVEPOINT `__\ 销毁一个保存点, 但保持在它被建立之后执行的命令的效果。 保存点只能在一个事务块内建立。可以在一个事务内定义多个保存点。 .. container:: refsect1 :name: id-1.9.3.169.9 .. rubric:: 示例 :name: 示例 要建立一个保存点并且后来撤销在它建立之后执行的所有命令的效果: .. code:: programlisting BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT; 上面的事务将插入值 1 和 3,但不会插入 2。 要建立并且稍后销毁一个保存点: .. code:: programlisting BEGIN; INSERT INTO table1 VALUES (3); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (4); RELEASE SAVEPOINT my_savepoint; COMMIT; 上面的事务将插入 3 和 4。 .. container:: refsect1 :name: id-1.9.3.169.10 .. rubric:: 兼容性 :name: 兼容性 当建立另一个同名保存点时,SQL 要求之前的那个保存点自动被销毁。在 OushuDB 中,旧的保存点会被保留,不过在进行 回滚或释放时只能使用最近的那一个(用 ``RELEASE SAVEPOINT``\ 释放较新的保存点将会 导致较旧的保存点再次变得可以被 ``ROLLBACK TO SAVEPOINT``\ 和 ``RELEASE SAVEPOINT``\ 访问)。在其他方面, ``SAVEPOINT``\ 完全符合 SQL。 .. container:: refsect1 :name: id-1.9.3.169.11 .. rubric:: 另见 :name: 另见 `BEGIN `__, `COMMIT `__, `RELEASE SAVEPOINT `__, `ROLLBACK `__, `ROLLBACK TO SAVEPOINT `__