【发布时间】: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命令,该命令定义了该上下文中后续COMMIT和ROLLBACK操作的行为。但是,您需要再次查看数据库的文档以了解具体信息。 -
我相信发生的是回滚回滚,然后catch中的提交将提交回滚后发生的任何数据库操作。我想这实际上很简单,我想了一会儿。
-
是的,这就是 SQL Server 文档的建议。您始终可以使用 SQL Profiler 验证这一点和/或在您的 DSN 中启用调试并检查日志文件。
标签: sql database coldfusion transactions coldfusion-10