协调的删除

当您必须修改多个表时,事务日志记录的用处特别明显。例如,考虑从演示数据库删除一个订单的问题。在该问题的最简单的形式中,您必须从两个表 ordersitems 同时删除行,如下列 GBase 8s ESQL/C 的示例所示:
EXEC SQL BEGIN WORK;
          EXEC SQL DELETE FROM items
          WHERE order_num = :o_num;
          if (SQLCODE >= 0)
          {
          EXEC SQL DELETE FROM orders
          WHERE order_num == :o_num;
{
            if (SQLCODE >= 0)
            EXEC SQL COMMIT WORK;
{
              else
              {
              printf("Error %d on DELETE", SQLCODE);
              EXEC SQL ROLLBACK WORK;
              }
不论是否使用事务,此程序的逻辑都很相似。如果未使用它们,则看到错误消息的人员更难作出决定。依赖于错误发生的时间,下列情况中的一种适用:
  • 未执行删除;此订单的所有行都保留在数据库中。
  • 删除了某些商品行,但不是全部;仅保留某些商品的订单记录。
  • 删除了所有商品行,但保留订单行。
  • 删除了所有行。

在第二种和第三种情况下,数据库受到一定程度的损害;它包含可导致某些查询产生错误结果的部分信息。您必须小心行事来恢复信息的一致性。当使用事务时,会防止所有这些不确定性。