概述
在某些情况下,可能需要成功地对数据库执行所有更新,也可能需要在发生错误时根本不执行任何更新。一组数据库更新将作为单个单元成功执行,或者根本不执行,这被称为事务。
银行业务的一个常见例子是两个账户之间的资金转账。事务的两个部分是从一个账户取走资金和将资金存入另一个账户。此事务的两个部分都必须发生,否则银行的账簿将失去平衡。存款和取款是一个事务。
如果满足以下条件,则可以创建使用与 Oracle 数据库兼容的事务控制样式的 SPL 应用程序:
- edb_stmt_level_tx 参数必须设置为 TRUE。这会阻止在发生异常时执行无条件回滚 BEGIN/END 块内的所有数据库更新的操作。
- 应用程序不得在自动提交模式下运行。如果自动提交模式打开,则会立即提交每个成功的数据库更新,并且无法撤消。打开或关闭自动提交模式的方式取决于应用程序。
事务在 SPL 程序中遇到第一个 SQL 命令时开始。所有后续的 SQL 命令都包含在该事务中。当发生以下任一情况时,事务就会结束:
- 发生未处理的异常,在这种情况下,事务期间执行的所有数据库更新的效果都将回滚,并且事务将中止。
- 遇到 COMMIT 命令,在这种情况下,事务期间执行的所有数据库更新的效果都将成为永久性的。
- 遇到 ROLLBACK 命令,在这种情况下,事务期间执行的所有数据库更新的效果都将回滚,事务将中止。如果遇到一个新的 SQL 命令,便会开始新的事务。
- 控制权返回调用应用程序(如 Java、PSQL 等),在这种情况下,应用程序的操作确定是提交还是回滚事务;除非事务位于声明了 PRAGMA AUTONOMOUS_TRANSACTION 的块内,在这种情况下,事务的提交或回滚独立于调用程序执行。
说明 与 Oracle 不同的是,DDL 命令(如 CREATE
TABLE)不隐式在其自己的事务中执行。因此,DDL 命令不会像在 Oracle 中那样自动导致立即数据库提交,但 DDL 命令可像 DML 命令一样回滚。
事务可跨一个或多个 BEGIN/END 块,单个 BEGIN/END 块也可包含一个或多个事务。
以下各节将更详细地讲述 COMMIT 和 ROLLBACK 命令。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论