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 绑定计划并优化访问路径
- 分析批处理程序的行为并重构那些消耗最多资源的部分