事务日志记录

在修改期间为任何种类的错误做准备的最好方式是使用事务日志记录。万一发生错误,您可告诉数据库服务器将数据库恢复原样。下列示例是基于 直接删除 部分中的示例的,将其扩展为使用事务:
EXEC SQL begin work;                 /* 开启事务 */
          EXEC SQL delete from items
          where order_num = :onum;
          del_result = sqlca.sqlcode;          /* 保存两个错误 */
          del_isamno = sqlca.sqlerrd[1];       /* 代码编号 */
          del_rowcnt = sqlca.sqlerrd[2];       /* 以及行的计数 */
          if (del_result < 0)                  /* 发现的问题:*/
          EXEC SQL rollback work;           /* 恢复一切 */
          else                                 /* 一切正常:*/
          EXEC SQL commit work;             /* 结束事务 */

此示例中的关键在于,在程序结束该事务之前,它将重要的返回值保存在 sqlca 结构中。像其他 SQL 语句一样,ROLLBACK WORK 和 COMMIT WORK 语句都在 sqlca 结构中设置返回代码。然而,如果您想要报告错误生成的代码,则必须在执行 ROLLBACK WORK 之前保存它们。ROLLBACK WORK 语句移除所有暂挂的事务,包括它的错误代码。

使用事务的优势在于,不管发生什么错误,数据库都处于已知的、可预测的状态。不存在修改完成了多少的问题;要不就是都完成了,要不就是都没完成。

在带有日志记录的数据库中,如果用户未启动一个显式的事务,则数据库服务器在语句执行之前初始化一个内部的事务,并在执行完成或失败后终止该事务。如果语句执行成功,则提交该内部的事务。如果语句失败,则回滚该内部的事务。