COMMIT / ROLLBACK VS ROLLBACK到SAVEPOINT的批量DB2性能

时间:2012-04-09 09:35:04

标签: db2 cobol mainframe

在COBOL批处理程序中,性能方面哪个更好?

使用commit:

IF SW-NEW-TRANSACT
  EXEC SQL
      COMMIT
  END-EXEC
END-IF.
PERFORM SOMETHING
   THRU SOMETHING-EXIT.
IF SW-ERROR
  EXEC SQL
      ROLLBACK
  END-EXEC
END-IF.

使用同步点:

IF SW-NEW-TRANSACT
  EXEC SQL
      SAVEPOINT NAMEPOINT ON ROLLBACK RETAIN CURSORS
  END-EXEC
END-IF.
PERFORM SOMETHING
   THRU SOMETHING-EXIT.
IF SW-ERROR
  EXEC SQL
      ROLLBACK TO SAVEPOINT NAMEPOINT
  END-EXEC
END-IF.

2 个答案:

答案 0 :(得分:4)

SAVEPOINTs和COMMIT不可互换。

进程总是必须在某个时候COMMIT或ROLLBACK数据库工作。一个COMMIT是 在之间进行事务(在完整的工作单元之间)。 COMMIT可以在每次交易后进行,或者如批处理中常见的那样, 经过多次交易后。一个COMMIT应该 永远不要在交易中进行(这会击败工作单位概念)。

SAVEPOINT通常在单个工作单元中 中发布。 SAVEPOINT应始终在完成后发布 一个单位的工作。它们总是在COMMIT上发布。

目的 SAVEPOINT的一部分是允许在一个工作单元内部分退出。当一个过程以一系列共同序列开始时,这很有用 数据库插入/更新后跟进程分支,在可以确定备用进程之前可以执行某些更新 分支应该已经执行。 SAVEPOINT允许退出“盲道”分支,然后继续使用备用 分支,同时保留共同的“前期”工作。如果没有SAVEPOINT,退出“死胡同”可能需要大量数据 在事务中缓冲(复杂处理)或ROLLBACK并从事务开始时用某种标志重新执行 表明需要遵循备用过程分支。所有这些都导致了复杂的应用逻辑。 ROLLBACK TO SAVEPOINT有几个优点。 它可以保留“预先”工作,节省了完成工作的成本。它可以节省回滚整个事务的时间。回滚可以更多 比原始插入/更新“昂贵”并且可能跨越多个事务(取决于提交频率)。 最后,当数据库工作可以时,通常会降低流程复杂性 通过ROLLBACK TO SAVEPOINT选择性地“撤消”。

SAVEPOINT如何用于提高批处理程序的效率?如果您的交易使用自我引发的回滚来恢复 从“死胡同”处理,然后SAVEPOINT可以是一个巨大的好处。同样,如果内部处理逻辑很复杂的话 需要避免为类似的“退出”要求执行数据库更新,然后可以使用SAVEPOINT将进程重构为 一些更简单,可能更有效的东西。除了这些因素外,SAVEPOINT不会影响性能 以积极的方式。

有些人声称在批处理程序中具有较高的COMMIT频率会降低性能。因此,提交频率越低 性能越好。调整COMMIT频率并非易事。提交频率越低,数据库资源就越长 因此,导致数据库超时的可能性越大。遭受数据库超时通常会导致 回滚的过程。回滚是非常昂贵的操作。 ROLLBACK是DBMS本身的重大打击 您的事务需要在重新启动后再次重新应用所有更新。降低提交频率可能会结束 花费你的钱远远超过它。当心!

修改

经验法则:提交费用。回滚的成本较高。

折扣回滚 由于数据不良,设备故障和程序异常(所有这些都很少见),大多数回滚都是由于 由于进程之间的资源争用而导致超时。执行较少的提交会增加数据库争用。干 较少的提交可能会提高性能。诀窍 是为了找出在不提交由于争用引起的回滚成本的情况下所获得的性能。那里 是影响这一点的众多因素 - 可能是动态的。我的总体建议是寻找其他地方 提高性能 - 调整提交频率(超时不是问题)通常是低回报 投资。

其他更有效的改善批次性能的方法通常包括:

  • 通过负载分割和运行同一作业的多个图像来改善并行性
  • 分析db / 2绑定计划和optomizing访问路径
  • 分析批处理程序的行为并重构消耗最多资源的那些部分

答案 1 :(得分:1)

这根本不是性能问题。

当您完成一个工作单元时,无论工作单元对您的应用程序意味着什么,您都会执行COMMIT。通常,这意味着您已经处理了完整的交易。在批处理世界中,您需要在1,000到2,000笔交易后进行提交,因此您不会花费所有时间进行COMMITing。该数字取决于在ROLLBACK中可以重新运行的事务数。

当您遇到某种错误(数据库错误或应用程序错误)时,您会回滚。

当你处理一个复杂的工作单元时,你SAVEPOINT,并且想要保存已经完成的工作而不需要完整的COMMIT。换句话说,您将获取一个或多个SAVEPOINT,然后最终执行COMMIT。