Sql 回滚后的事务提交

Sql 回滚后的事务提交,sql,database,coldfusion,transactions,coldfusion-10,Sql,Database,Coldfusion,Transactions,Coldfusion 10,我们有我正在维护的代码,我有这样的代码: <cftransaction> <cftry> ... do some stuff here which may throw an exception ... <cftransaction action="commit"> <cfcatch> <cftransaction action="rollback">

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

<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>

... 在这里做一些可能引发异常的事情。。。
我对回滚后发生的捕获中的提交有点怀疑。我已经在互联网站上搜索了这种情况下可能发生的情况,但到目前为止还没有找到任何信息说明在回滚到同一事务块后尝试提交会发生什么。有人知道这会做什么,这是可以做的还是一件坏事吗


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

我假设您的somefunction影响数据库()是如何记录错误的?如果您使用的是Oracle,那么我建议您的存储过程中不包含提交。当到达关闭cftransaction标记时,将发生提交。但对于日志错误等,您可以将存储的proc声明为PRAGMA autonomy_事务;它会有一个承诺。这样,您就不必担心使用任何操作=“回滚或提交”。我们有一个巨大的应用程序,很少需要使用cftransaction来提交或回滚,因为我们需要所有的东西来工作,或者所有的东西都要回到原来的状态。我们的错误日志记录是PRAGMA autonomy_事务所需的唯一过程;如果您没有使用Oracle,那么请忽略,对不起,您没有指定后端。

冒险问我们的DBA。他指出回滚将回滚在db中完成的任何操作,并且在该点上的任何进一步更改(如someFunction…调用所做的更改)都将在后续提交时提交。我还没有做一个简单的测试,它可能因数据库设置和供应商而异,但我认为这就是它的工作原理。

具体取决于数据库。您使用的是哪种数据库管理系统和版本?(在任何db问题中包含该信息总是很好的)。我相信在SQL Server中,打开
cftransaction
(无任何操作)会触发一个命令,该命令定义了该上下文中后续
COMMIT
ROLLBACK
操作的行为。但是,您需要再次检查数据库文档以了解具体情况。我相信发生的是回滚回滚,然后catch中的commit将提交回滚后发生的任何db操作。我想,在考虑了一下之后,它实际上相当简单。是的,这就是SQL Server文档所建议的。您始终可以使用SQL探查器验证这一点,和/或在DSN中启用调试并检查日志文件。