2009-12-23 73 views
3

我已經看到了許多不同的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

兩個注意事項:

我想你想把cftry塊放在cftransaction周圍。否則,它將回滾事務,然後嘗試提交它。

其次,我相信如果查詢不返回錯誤,關閉該事務意味着您希望提交。提交線沒有錯,只是多餘的。如果您想要自動檢查,請將其忽略。

1

正如你所做的那樣,「commit」和「rollback」行是多餘的。如果您希望提交某些查詢並將其他人回滾,那麼它們只會非常有用。既然你做了全部或沒有,你真的不需要它們。

我一般這樣做:

<cftry> 
    <cftransaction> 
    <!--- multiple insert/update queries ---> 
    </cftransaction> 
    <cfcatch type="database"> 
    <!--- log error, show user message ---> 
    </cfcatch> 
</cftry> 
+0

如果出現錯誤,這不會造成問題嗎?你永遠不會讓它進入 Jason

+0

否,因爲這是默認行爲。如果CFTRANSACTION塊中的任何查詢失敗,它們都會回滾。 – ale

+1

我同意提交和回滾是多餘的(當只使用單個事務時)。但是,有些人更喜歡使用它們來增加清晰度。當依賴隱式提交/回滾行爲時,代碼正在做什麼並不明顯。 – Leigh

0

看來你可以做得比這更簡單的ColdFusion的9:

<cfscript> 
    transaction { 
    // ... your DB code 
    } 
</cfscript> 

我有它在我的應用程序的所有其他地方生產,它按預期工作:更改在事務塊結束時提交(除非它嵌套),並且任何異常都會觸發回滾。其次,我並不積極,但我認爲顯式提交可能是嵌套事務的一個問題。通常情況下,如果您的事務塊處於某個函數中,並且嵌套在較高級別的事務中,則不會提交。