【问题标题】:Transaction commit following rollback回滚后的事务提交
【发布时间】:2014-02-06 04:20:08
【问题描述】:

我们有我正在维护的代码,我有这样的东西:

<cftransaction>
    <cftry>
        ... do some stuff here which may throw an exception ...
        <cftransaction action="commit">
        <cfcatch>
            <cftransaction action="rollback">
            <cfif someCondition>
                <cfset someFunctionThatAffectsTheDB() />
                <cftransaction action="commit" />
            </cfif>
        <cfcatch>
    <cftry>
</cftransaction>

我对回滚后发生的捕获中的提交持怀疑态度。我已经在互联网上搜索了有关在这种情况下可能发生的情况的信息,但到目前为止还没有发现任何可以说明如果您在同一事务块内回滚后尝试提交会发生什么情况。有谁知道这会做什么以及是否可以这样做还是一件坏事?

(我问的原因是因为我们的数据库中有一个我认为不可能的数据状态,我想知道提交后回滚的行为是否未定义且微妙,可能导致我看到了。)

【问题讨论】:

  • 具体情况取决于数据库。您使用的是哪个 dbms 和版本? (在任何数据库问题中包含该信息总是很好的)。我相信对于 SQL Server,打开 cftransaction(没有任何操作)会触发一个 SET IMPLICIT_TRANSACTION ON 命令,该命令定义了该上下文中后续 COMMITROLLBACK 操作的行为。但是,您需要再次查看数据库的文档以了解具体信息。
  • 我相信发生的是回滚回滚,然后catch中的提交将提交回滚后发生的任何数据库操作。我想这实际上很简单,我想了一会儿。
  • 是的,这就是 SQL Server 文档的建议。您始终可以使用 SQL Profiler 验证这一点和/或在您的 DSN 中启用调试并检查日志文件。

标签: sql database coldfusion transactions coldfusion-10


【解决方案1】:

我假设您的 someFunctionThatAffectsTheDB() 是您记录错误的方式?如果您使用的是 Oracle,那么我建议您的任何存储过程都不包含提交。当到达关闭 cftransaction 标记时,将发生提交。但是对于记录错误等,您会将存储的过程声明为 PRAGMA AUTONOMOUS_TRANSACTION;它会有一个提交。然后您不必担心使用任何操作=“回滚或提交”。我们有一个庞大的应用程序,并且很少需要使用 cftransaction 来提交或回滚,因为我们需要一切正常工作,或者一切都回到原来的状态。我们的错误记录是唯一需要 PRAGMA AUTONOMOUS_TRANSACTION 的过程;如果您没有使用 Oracle,请忽略,抱歉,您没有指定后端。

【讨论】:

    【解决方案2】:

    不顾一切地询问我们的 DBA。他表示回滚将回滚数据库中已完成的任何操作,并且此时任何进一步的更改(如 someFunction... 调用所做的更改)都将在后续提交时提交。我还没有做过简单的测试,它可能会因数据库设置和供应商而异,但我认为这就是它的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2012-12-24
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多