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

Sql 在只有选择的事务中,提交和回滚之间有区别吗?,sql,oracle,transactions,commit,rollback,Sql,Oracle,Transactions,Commit,Rollback,我们公司使用的内部应用程序框架使得有必要将每个SQL查询放入事务中,即使我知道没有任何命令会对数据库进行更改。在会话结束时,在关闭连接之前,我提交事务以正确关闭它。我想知道如果我把它向后滚动,是否有什么特别的区别,特别是在速度方面 请注意,我正在使用Oracle,但我想其他数据库也有类似的行为。此外,对于开始事务的要求,我无能为力,代码库的这一部分已不在我的掌握之中。由于您没有执行任何DML,我怀疑Oracle中的提交和回滚之间没有区别。无论哪种方式,都没有什么可做的。一般来说,提交比回滚快得多

我们公司使用的内部应用程序框架使得有必要将每个SQL查询放入事务中,即使我知道没有任何命令会对数据库进行更改。在会话结束时,在关闭连接之前,我提交事务以正确关闭它。我想知道如果我把它向后滚动,是否有什么特别的区别,特别是在速度方面


请注意,我正在使用Oracle,但我想其他数据库也有类似的行为。此外,对于开始事务的要求,我无能为力,代码库的这一部分已不在我的掌握之中。

由于您没有执行任何DML,我怀疑Oracle中的提交和回滚之间没有区别。无论哪种方式,都没有什么可做的。

一般来说,提交比回滚快得多,但在没有做任何事情的情况下,它们实际上是相同的。

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

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

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


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

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

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

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

另一方面,提交或多或少是预期的结果,我怀疑丢弃回滚区域可能会稍微快一点。您没有创建任何事务条目,因此db编写器甚至不会醒来检查并发现无需执行任何操作


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

文件规定:

  • Oracle建议您在断开与Oracle数据库的连接之前,使用COMMIT或ROLLBACK语句明确结束应用程序中的每个事务,包括最后一个事务。如果没有显式提交事务,并且程序异常终止,那么最后一个未提交的事务将自动回滚。大多数Oracle实用程序和工具的正常退出会导致提交当前事务。Oracle预编译器程序的正常退出不会提交事务,而是依赖Oracle数据库回滚当前事务


如果你想选择做一个或另一个,那么你最好做一个与不做任何事情相同的事情,然后提交它。

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

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


所以,至少有时有必要在事务中执行SELECTs。

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

我根本不认为这是对oracle工作方式的描述。这听起来像是一个应用于Oracle的通用描述。对Oracle工作方式的猜测不太可能有用。Oracle将该日志称为“重做日志文件”。它将回滚段称为“撤消表空间”。你知道哪个更快吗?提交还是回滚