2013-12-22 153 views
1

也許這是一個真正的小問題,因爲我對於處理與PetaPoco的交易相當新。 問題我正在使用PATA作爲一個microORM來處理我的數據庫事務,如果我在事務的.Complete()方法之前拋出一個異常,所有事情都會正確回滾,但如果我在PetaPoco交易不回滾

內部捕獲異常
Using scope As PetaPoco.Transaction = db.GetTransaction() 
    ' try/catch here and if the db command fails transaction won't roll back 

    scope.Complete() 
End Using 

如果某個數據庫操作失敗,事務將不會回滾。我該如何解決這個問題?

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

我不熟悉PetaPoco交易。但是,快速查看PetaPoco的代碼,事務管理在Microsoft環境中似乎很有趣並且坦率地說是無用的。你爲什麼不用一個標準的TransactionScope使用語句來包圍你的事務代碼(就像這樣:http://msdn.microsoft.com/library/ee818746.aspx),它對於大多數標準數據庫來說應該是正常的。 –

+0

謝謝西蒙,我覺得petapoco在底層使用的是這個對象infact,即使是petapoco,你也不能「手動」回滾事務,但它的工作原理就像「如果你想回滾一個事務,你不應該調用Complete方法例如,你可以在範圍內拋出異常,它參與的事務將被回滾。「 但由於某種原因,我試圖不叫.Compete(),但第一個數據庫查詢成功了相同。順便說一句,我會給一個普通的.NET方法一個鏡頭,並在這裏報告。 – Manight

回答

2

問題是我沒有正確處理「調用/未調用」scope.Complete()基於沿路徑截獲的異常。 特別是我有一個布爾標誌「rollBackTransaction」從false開始,然後更新爲true,如果事務內的任何try/catch塊引發和異常。 最後我剛剛檢查了它:

    If Not rollBackTransaction Then 
         scope.Complete() 
        End If 

這可如果.Complete()不關閉使用塊之前調用中使用,以及由西蒙至極建議最終會回滾事務中的TransactionScope。

現在什麼導致了一個假標誌,因此每次調用scope.Complete()方法時,我在事務內部調用了一個子對象,它擁有自己的異常處理,因此永遠不會在主事務中引發異常塊來正確更新「rollBackTransaction」標誌。

我學到的是,如果您在事務內部使用try/catch,請確保您調用的外部方法在引發異常時引發異常,並根據您將調用的作用域一直更新標誌。完成()。

無論如何西蒙,感謝指出,我不知道的.NET功能似乎是非常有用的! 不知道它會包含在交易中......文件系統的變化?