我可以用保存点替换在Oracle中启动新事务吗?

Jas*_*ker 6 oracle commit ora-01555 oracle10g savepoints

现在,我们用于插入记录集的过程是这样的:

(并注意"记录集"意味着某人的记录以及他们的地址,电话号码或任何其他联合表).

  1. 开始交易.
  2. 插入一组相关的记录.
  3. 如果一切都成功则提交,否则回滚.
  4. 返回步骤1以获取下一组记录.

我们应该做更像这样的事吗?

  1. 在脚本开头启动事务
  2. 为每组记录启动保存点.
  3. 插入一组相关记录.
  4. 如果出现错误,请回滚到保存点,如果一切都成功则继续.
  5. 在脚本开头提交事务.

在与ORA-01555有一些问题并阅读一些Ask Tom文章(比如这篇文章)后,我正在考虑尝试第二个过程.当然,正如Tom指出的那样,开始新的交易是应该由业务需求定义的.第二个过程值得尝试,还是一个坏主意?

APC*_*APC 5

交易应该是一个有意义的工作单元.但是,工作单元的构成取决于具体情况.在OLTP系统中,工作单元将是单个人,以及他们的地址信息等.但听起来好像您正在实施某种形式的批处理,这会加载很多人.

如果您遇到ORA-1555问题,几乎可以肯定是因为您有一个长时间运行的查询提供正由其他事务更新的数据.在循环内部进行提交有助于循环使用UNDO段,因此往往会增加您依赖提供读取一致性的段可能被重用的可能性.所以,不这样做可能是一个好主意.

是否使用SAVEPOINTs解决方案是另一回事.我不确定在你的情况下会给你带来什么好处.在使用Oracle10g时,您可能应该考虑使用批量DML错误日志记录.

或者,您可能希望重写驱动查询,以便它可以使用较小的数据块.如果不了解您的流程细节,我无法提供具体的建议.但总的来说,不是打开10000个记录的一个光标,而是打开它20次,每次打开500行.另一件需要考虑的事情是,是否可以通过使用批量收集和FORALL来提高插入过程的效率.