我们有代码我在维护我的地方:
<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>
我对回滚后发生的catch中的提交有点怀疑。我已经搜索了interwebs以获取有关在这种情况下可能发生的事情的信息,但是到目前为止还没有找到任何可以说如果你在回滚到同一个事务块之后尝试提交将会发生什么的信息。有谁知道这会做什么,是否可以做或者是坏事?
(我问的原因是因为我们的数据库中有一个数据状态,我认为不应该是可能的,我想知道回滚后提交的行为是否是未定义和微妙的,可能会导致我我看到了。)
答案 0 :(得分:0)
我假设您的someFunctionThatAffectsTheDB()是如何记录错误的?如果您使用的是Oracle,那么我建议您的存储过程都不包含提交。当达到关闭cftransaction标记时,将发生提交。但是对于记录错误等,你会将存储过程声明为PRAGMA AUTONOMOUS_TRANSACTION;它会有一个提交。然后您不必担心使用任何操作=“回滚或提交”。我们有一个庞大的应用程序,很少需要使用cftransaction来提交或回滚,因为我们需要一切工作,或者一切都要回到原来的状态。我们的错误记录是唯一需要PRAGMA AUTONOMOUS_TRANSACTION的过程;如果您没有使用Oracle,那么请忽略,抱歉,您没有指定后端。
答案 1 :(得分:0)
走出困境,问我们的DBA。他表示回滚会回滚已在db中完成的任何操作,并且此时的任何进一步更改(如someFunction ...调用所做的更改)将在后续提交时提交。我没有完成一个简化的测试,它可能因数据库设置和供应商而异,但我认为这是它的工作原理。