事务控制

更新时间: 2024-12-17 15:17:18

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

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

如果满足以下条件,则可以创建使用与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命令。

上一篇: IF-THEN-ELSIF-ELSE 下一篇: COMMIT
阿里云首页 云原生数据库 PolarDB 相关技术圈