当连续的 SQL 语句执行的是逻辑上的一个工作单元,您可以通过在 BEGIN WORK 和 COMMIT WORK 语句之间给它们分组来定义此事务。 如果此任务需求要求要么所有语句都执行成功,要么 它们都没被执行,则您可以在启动事务 BEGIN 和成功完成此事务 COMMIT WORK (或者 ROLLBACK WORK ,如果程序检测到错误,则取消该事务)之间包含该事务的语句。
以下代码分段中,该事务锁定了 stock 表(LOCK TABLE),更改了 stock 表中的行 (UPDATE),从 stock 表删除行(DELETE)并将行插入 manufact 表(INSERT)。在此示例 中(没有错误处理),数据库服务器按顺序执行这些 SQL 语句:
BEGIN WORK;
LOCK TABLE stock;
?UPDATE stock SET unit_price = unit_price * 1.10?
?WHERE manu_code = 'KAR'; DELETE FROM stock WHERE description = 'baseball bat';?
INSERT INTO manufact (manu_code, manu_name, lead_time)?
?VALUES ('LYM', 'LYMAN', 14);
?COMMIT WORK;??
每个语句本身就是原子;它成功完成或者数据库从未更改。如果任一语句失败,其它语句仍会继续 执行,其结果好像是失败语句从未尝试执行。当 COMMIT WORK?语句执行后,这些成功的变更 将变成永久性的。?
然而,一般情况下,事务被定义为带有错误处理,因此数据库服务器必须完整执行这一系列操作, 或者完全不执行。在这种情况下,当您在单个事务中包含所有这些操作时,数据库服务器保证所有 的语句完整地一个不漏地提交到磁盘,或者恢复到与事务开始之前完全相同的状态。?
通过提交错误处理属性(例如,在 DB-Access 中设置 DBACCNOIGN 环境变量或者在?ESQL/C?中添加 EXEC SQL WHENEVER ERROR STOP),该事务可隐式地回滚,因为此程序由于一个错 误而停止且没有执行?COMMIT WORK。更多细致的条件编码例如(ESQL/C)允许程序员在继续 执行更大的程序时显式回滚该事务。
应用程序和 UDRs 中的错误处理和业务逻辑还可通过包含 SAVEPOINT 和?ROLLBACK TO SAVEPOINT?语句将事务分隔为一个或多个分区。如果在遇到错误后,或在事务的部分结构指示与 业务规范或其它标准冲突之后发出?ROLLBACK TO SAVEPOINT 语句,只有在 ROLLBACK?语句 和其指定或缺省的保存点之间的数据库的更改会被取消,而不是取消整个事务。ROLLBACK?之后 当前事务继续该语句,包括数据未提交的变更或数据库超过保存点仍暂挂的操作的结构都将继续执 行。直到整个事务被提交或回滚。任何已回滚语句持有的锁定将会保留直到此事务完全结束。