我看过许多不同的cftransaction
示例并阅读了不同的网站,但仍然无法找到cftransaction
部分必要的确切答案。我想要完成的事情非常简单:
如果在插入/更新期间的任何时候出现错误,我想回滚该事务。以下是我过去所做的事情:
<cftransaction>
<cftry>
<!--- multiple insert/update queries --->
<cfcatch type="any">
<cftransaction action="rollback">
<!--- log error, show user message --->
</cfcatch>
</cftry>
<cftransaction action="commit">
</cftransaction>
这是对的吗?什么是最佳做法?并非cftransaction
的所有实例都遵循上述示例。有些只有开始和结束标签。
我一直看到我的数据库服务器存在一些问题,并认为不正确使用事务可能是其中一个问题。我在活动监视器中看到大量的set transaction isolation level read committed
进程占用了大量的CPU。
答案 0 :(得分:1)
正如您所做的那样,“提交”和“回滚”行是多余的。如果您想要提交一些查询并回滚其他查询,那么它们才真正有用。既然你正在全部或全部都没有,你真的不需要它们。
我通常这样做:
<cftry>
<cftransaction>
<!--- multiple insert/update queries --->
</cftransaction>
<cfcatch type="database">
<!--- log error, show user message --->
</cfcatch>
</cftry>
答案 1 :(得分:0)
两个注释:
我认为您希望将cftry块放在cftransaction周围。否则,它将回滚事务,然后尝试提交它。
其次,我相信如果查询不返回错误,关闭事务意味着您希望提交。提交行没有错,只是多余的。如果您想要自动检查,请省略它。
答案 2 :(得分:0)
看起来你可以做的比ColdFusion 9更简单:
<cfscript>
transaction {
// ... your DB code
}
</cfscript>
我的应用程序中的所有其他位置都在生产中并且按预期工作:更改在事务块结束时提交(除非它已嵌套)并且任何异常都将触发回滚。
其次,我不是肯定的,但我认为显式提交可能是嵌套事务的问题。通常,如果事务块在函数中并且嵌套在更高级别的事务中,则不希望提交。