代码之家  ›  专栏  ›  技术社区  ›  Tamas Czinege

在只有选择的事务中,提交和回滚之间有区别吗?

  •  20
  • Tamas Czinege  · 技术社区  · 17 年前

    请注意,我正在使用Oracle,但我想其他数据库也有类似的行为。此外,对于开始事务的要求,我也无能为力,代码库的这一部分已经超出了我的控制范围。

    7 回复  |  直到 17 年前
        1
  •  13
  •   S.Lott    17 年前

    数据库通常保留前映像日志(事务之前的日志)或后映像日志(事务完成时的日志)。如果它保留前映像,则必须在回滚时恢复。如果它保留一个after映像,则在提交时必须替换数据。

    Oracle既有日志空间又有回滚空间。事务日志累积数据块,这些数据块随后由DB写入程序写入。由于这些都是非同步的,几乎没有任何与DB writer相关的内容会对事务产生任何影响(如果队列已满,那么您可能需要等待)

    即使对于仅查询的事务,我也愿意打赌Oracle的回滚区域中会保留一些事务记录。我怀疑回滚需要Oracle方面做一些工作,然后才能确定实际没有回滚内容。我认为这与你的交易是同步的。在回滚完成之前,您无法真正释放任何锁。[是的,我知道您在事务中没有使用任何锁,但锁定问题是为什么我认为必须完全释放回滚,然后才能释放所有锁,然后完成回滚。]

    我还预计,虽然commit可能更快,但差异将很小。如此之小,以至于你甚至无法在并列比较中测量它们。

        2
  •  8
  •   Walter Mitty    17 年前

    我同意前面的回答,在这种情况下提交和回滚没有区别。确定无需提交所需的CPU时间与确定无需回滚所需的CPU时间之间的差异可能可以忽略不计。但是,如果差别可以忽略不计,我们可以放心地忘掉它。

    但是,值得指出的是,在单个事务上下文中执行一系列查询的会话与在一系列事务上下文中执行相同查询的会话之间存在差异。

    如果客户机启动事务、执行查询、执行提交程序回滚,然后启动第二个事务并执行第二个查询,则无法保证第二个查询将观察到与第一个查询相同的数据库状态。有时,维护数据的单一一致视图至关重要。有时,获取更为最新的数据视图至关重要。这取决于你在做什么。

    我知道,我知道,OP没有问这个问题。但有些读者可能会在心里问这个问题。

        3
  •  3
  •   Tony Andrews    17 年前

    一般来说,提交要比回滚快得多,但是在您什么都没做的情况下,它们实际上是一样的。

        4
  •  3
  •   David Aldridge    17 年前

    文件指出:

    http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110

    如果你想选择做一件或另一件事,那么你最好做一件与什么都不做一样的事,然后把它付诸实施。

        5
  •  1
  •   pero    17 年前

    好吧,我们必须考虑SELECT在Oracle中返回的内容。有两种模式。默认情况下,SELECT返回的数据与SELECT语句开始执行时查看的数据相同(这是READ COMMITED隔离模式(默认事务模式)中的默认行为)。所以,如果在发出SELECT之后执行了更新/插入,则该更新/插入在结果集中不可见。

    如果您需要比较两个结果集(例如总账应用程序的借方a和贷方),这可能是一个问题。为此,我们有第二种模式。在该模式下,SELECT返回当前事务开始时的数据(只读和可序列化隔离级别中的默认行为)。

        6
  •  0
  •   cagcowboy    17 年前

    由于您还没有完成任何DML,我怀疑在Oracle中提交和回滚之间没有区别。不管怎样都没什么可做的。

        7
  •  0
  •   Andrew    15 年前

    我认为承诺会更有效率;因为通常您希望提交大多数DB事务;因此,您可能认为DB针对这种情况进行了优化(而不是尝试更有效地回滚)。