应用程序层数据库事务的最佳实践

时间:2009-12-23 16:13:51

标签: sql-server-2005 coldfusion transactions

我看过许多不同的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。

3 个答案:

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

我的应用程序中的所有其他位置都在生产中并且按预期工作:更改在事务块结束时提交(除非它已嵌套)并且任何异常都将触发回滚。

其次,我不是肯定的,但我认为显式提交可能是嵌套事务的问题。通常,如果事务块在函数中并且嵌套在更高级别的事务中,则不希望提交。