0

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

提交:

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.
4

2 回答 2

5

SAVEPOINT 和 COMMIT 不可互换。

进程总是必须在某个时刻提交或回滚数据库工作。事务之间(完整的工作单元之间)进行COMMIT 。COMMIT 可以在每个事务之后执行,或者像批处理中常见的那样,在多个事务之后执行。决不应该在事务中进行 COMMIT(这违背了 UNIT OF WORK 概念)。

SAVEPOINT 通常单个工作单元中获取并可能释放。SAVEPOINTs 应该总是在完成一个工作单元时被释放。它们总是在 COMMIT 时被释放。

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

SAVEPOINT 如何用于提高批处理程序的效率?如果您的事务使用自我诱导的回滚来从“死胡同”处理中恢复,那么 SAVEPOINT 可能是一个巨大的好处。类似地,如果内部处理逻辑因需要避免为类似的“回退”要求执行数据库更新而变得复杂,则可以使用 SAVEPOINT 将过程重构为更简单且可能更有效的方法。除了这些因素之外,SAVEPOINT 不会以积极的方式影响性能。

一些人声称在批处理程序中具有较高的 COMMIT 频率会降低性能。因此,提交频率越低,性能越好。调整 COMMIT 频率并非易事。提交频率越低,持有的数据库资源就越长,因此导致数据库超时的可能性就越大。遭受数据库超时通常会导致进程回滚。回滚是一项非常昂贵的操作。ROLLBACKs 对 DBMS 本身来说是一个很大的打击,一旦重新启动,您的事务需要再次重新应用所有更新。降低提交频率最终可能会让您付出比获得更多的代价。谨防!

编辑

经验法则:提交是有代价的。回滚的成本更高。

不考虑由于坏数据、设备故障和程序异常终止(所有这些都应该很少见)导致的回滚,大多数回滚是由于进程之间的资源争用而导致的超时。执行较少的提交会增加数据库争用。减少提交可能会提高性能。诀窍是找到在不提交权重的情况下获得的性能,以及由于争用而导致的回滚成本。影响这一点的因素有很多——其中可能是动态的。我的总体建议是寻找其他地方以提高性能 - 调整提交频率(超时不是问题)通常是低回报投资。

提高批次性能的其他更有成效的方法通常包括:

  • 通过负载拆分和运行同一作业的多个图像来提高并行性
  • 分析 db/2 绑定计划并优化访问路径
  • 分析批处理程序的行为并重构那些消耗最多资源的部分
于 2012-04-10T14:33:56.467 回答
1

这根本不是性能问题。

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

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

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

于 2012-04-09T14:03:45.500 回答