在某些情况下,可能需要成功地对数据库执行所有更新,也可能需要在发生错误时根本不执行任何更新。一组数据库更新将作为单个单元成功执行,或者根本不执行,这被称为事务。

银行业务的一个常见例子是两个账户之间的资金转账。事务的两个部分是从一个账户取走资金和将资金存入另一个账户。此事务的两个部分都必须发生,否则银行的账簿将失去平衡。存款和取款是一个事务。

如果满足以下条件,则可以创建使用与 Oracle 数据库兼容的事务控制样式的 SPL 应用程序:

  • polar_comp_stmt_level_tx参数必须设置为 TRUE。这会阻止在发生异常时执行无条件回滚 BEGIN/END 块内的所有数据库更新的操作。
  • 应用程序不得在自动提交模式下运行。如果自动提交模式打开,则会立即提交每个成功的数据库更新,并且无法撤消。打开或关闭自动提交模式的方式取决于应用程序。

事务在 SPL 程序中遇到第一个 SQL 命令时开始。所有后续的 SQL 命令都包含在该事务中。当发生以下任一情况时,事务就会结束:

  • 发生未处理的异常,在这种情况下,事务期间执行的所有数据库更新的效果都将回滚,并且事务将中止。
  • 遇到 COMMIT 命令,在这种情况下,事务期间执行的所有数据库更新的效果都将成为永久性的。
  • 遇到 ROLLBACK 命令,在这种情况下,事务期间执行的所有数据库更新的效果都将回滚,事务将中止。如果遇到一个新的 SQL 命令,便会开始新的事务。
  • 控制权返回调用应用程序(如 Java、PSQL 等),在这种情况下,应用程序的操作确定是提交还是回滚事务;除非事务位于声明了 PRAGMA AUTONOMOUS_TRANSACTION 的块内,在这种情况下,事务的提交或回滚独立于调用程序执行。
说明 与 Oracle 不同的是,DDL 命令(如 CREATETABLE)不隐式在其自己的事务中执行。因此,DDL 命令不会像在 Oracle 中那样自动导致立即数据库提交,但 DDL 命令可像 DML 命令一样回滚。

事务可跨一个或多个 BEGIN/END 块,单个 BEGIN/END 块也可包含一个或多个事务。

以下各节将更详细地讲述 COMMIT 和 ROLLBACK 命令。