您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

COMMIT 和 ROLLBACK

SQLScript 中原生支持 COMMITROLLBACK 命令。

COMMIT 命令提交当前事务以及将 COMMIT 命令写入持久性之前的所有更改。

ROLLBACK 命令回退当前事务并撤消自上次 COMMIT 以来的所有更改。

示例 1:

CREATE PROCEDURE PROC1() AS

BEGIN

UPDATE B_TAB SET V = 3 WHERE ID = 1;

COMMIT;

UPDATE B_TAB SET V = 4 WHERE ID = 1;

ROLLBACK;

END;

在此示例中,B_TAB 表在执行 PROC1 过程之前有一行:

V标识01 

执行 PROC1 过程后,B_TAB 表更新如下:

V标识31 

这意味着只有过程中的第一个更新会影响 B_TAB 表。第二次更新不会影响 B_TAB 表,因为它已回退。

下图提供了有关事务行为的更多详细信息。使用第一个 COMMIT 命令,提交事务 tx1 并将 B_TAB 表上的更新写入持久性。由于 COMMIT,将启动一个新事务,tx2。

通过触发 ROLLBACK,将还原在事务 tx2 中完成的所有更改。在示例 1 中,第二次更新已还原。此外,在执行回退后,将启动新的事务,tx3。

事务边界与过程块无关。这意味着,如果嵌套过程包含 COMMIT/ROLLBACK,则顶级过程的所有语句都会受到影响。

示例 2:

CREATE PROCEDURE PROC2() AS

BEGIN

UPDATE B_TAB SET V = 3 WHERE ID = 1;

COMMIT;

END;

CREATE PROCEDURE PROC1() AS

BEGIN

UPDATE A_TAB SET V = 2 WHERE ID = 1;

CALL PROC2();

UPDATE A_TAB SET V = 3 WHERE ID = 1;

ROLLBACK;

END;

在示例 2 中,PROC1 过程调用 PROC2过程。PROC2 中的 COMMIT 提交在 tx1 事务中完成的所有更改(请参阅下图)。这包括 PROC1 过程中的第一个 update 语句以及 PROC2 过程中的 update 语句。COMMIT,新事务将隐式启动,tx2。

因此 PROC1 中的 ROLLBACK 命令只影响以前的 update 语句;所有其它更新均通过 tx1 事务提交。

备注如果过去使用 DSQL 执行这些命令(例如 EXEC ‘COMMIT’、EXEC ’ROLLBACK’),SAP 建议您使用本地命令 COMMIT/ROLLBACK 替换所有事件,因为它们更安全。标量 UDF 或表 UDF 中不支持 COMMIT/ROLLBACK 命令。