SQLScript 中原生支持 COMMIT 和 ROLLBACK 命令。
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 命令。