事务控制
在某些情况下,可能需要成功地对数据库执行所有更新,也可能需要在发生错误时根本不执行任何更新。一组数据库更新将作为单个单元成功执行,或者根本不执行,这被称为事务。
银行业务的一个常见示例是两个账户之间的资金转账。事务的两个部分是从一个账户取走资金和将资金存入另一个账户。此事务的两个部分都必须发生,否则银行的账簿将失去平衡。存款和取款是一个事务。
如果满足以下条件,则可以创建使用与Oracle数据库兼容的事务控制样式的SPL应用程序:
polar_comp_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命令。