COMMIT和ROLLBACK之间的开销是否存在差异?

时间:2014-09-03 16:32:03

标签: sql oracle oracle11g

我正在开发一个应用程序,它在单个事务中写入表然后读取该表。一旦完成读取,就不再需要这些更改,可以安全地丢弃。但另一方面,如果提交的话,这些改变不会干扰其他任何事情。

简而言之,我可以使用rollback或commit来结束事务,只需要考虑效率。

那么,哪一个,哪个会比另一个快,为什么?

2 个答案:

答案 0 :(得分:5)

Oracle生成重做在线日志文件和撤消数据。联机重做日志文件包含DML / DDL语句以重做事务(如果发生停电),并在调用回滚语句时撤消数据。

Commit是一个非常快的运算符,它的时间是常量,不依赖于事务的大小。这是可能的,因为LGWR进程在后台事务期间将重做更改写入光盘。如果使用异步提交,例如使用commit write nowait batch;,则提交的时间几乎等于0。

回滚取决于事务的大小,因为它需要撤消与事务相关的重做日志文件中的任何语句,因此事务的时间可能等于事务回滚的时间。

对于短期交易,可能没有差异,但对于中期和长期交易,您会注意到时间或回滚几乎等于交易时间。

答案 1 :(得分:2)

提交应该更快,因为Oracle使用"快速提交",即它假定您将继续提交并立即将更改写入数据库文件或缓冲区缓存。

由于您可能仍然决定回滚,因此它会在"之前存储"回滚序列中的信息。提交实质上会丢弃部分回滚段,并将事务标记为已提交。

然而,回滚就像一个完整的"撤消"在一个应用程序中Oracle需要通过回滚段中的内容替换其实际的数据视图。这是真正的工作。

最终你需要清理你的数据,然后你需要投入一些时间。