2011-07-20 39 views
0

我正在做的多層MVVM WPF應用程序,其被連接到Oracle數據庫。我需要一些關於TransactionScope的解釋。請看下面的例子:交易中使用C#更新數據庫

using (TransactionScope ts = new TransactionScope()) 
{ 
    ... 
    bank.setID(BankName, Branch); 

    check.addCheck(check); 
    ... 
    ts.Complete(); 
} 

此代碼是唯一的解釋:bank.setID()更新記錄,而實際上addCheck插入的記錄。我無法弄清楚如何測試這個。我想在使用第二種方法插入數據庫之前執行數據庫的更新和關閉操作,然後檢查更新是否回滾。這是對的嗎?我在正確的軌道上嗎?這是TransactionScope的目的嗎?

在此先感謝

回答

2

編輯:我不知道在第一,如果你瞭解數據庫的事務,所以這裏是一個非常簡短的描述:

TransactionScope設計包裝一個database transaction有一種機制,是exception safe

您使用它來包裝一組應用atomic事務的操作,因此如果您在一次更新時失敗,則該事務中的所有數據庫操作都會回滾。

您在using塊中使用它,這樣如果你的代碼拋出一個異常,事務被回滾,而不是提交到數據庫。

我想在使用第二種方法插入之前執行更新並關閉數據庫,然後檢查是否回滾更新...我在正確的軌道上嗎?

是的。您的代碼應該已經處理:

  • 如果DB被關閉addCheck確實插入之前,然後在插入應該拋出一個異常
  • 由於異常被拋出,Complete應該永遠不會叫
  • 的finally塊應自動回滾事務時(隱藏)達到finally塊,並Complete沒有被調用

我無法弄清楚如何測試這個

如果你想編寫一個單元測試爲您的代碼,那麼我不會建議「採取DB脫機在執行過程中」的方法。

相反,我建議讓您的數據庫邏輯足夠的靈活性,在不同的數據塊指向。然後,刪除表格或addCheck插入的某些列。嘗試設置您的數據庫,以便setID成功,但addCheck失敗。

2

TransactionScope是有據可查的。 MSDN它。

測試它是如何工作的,沒有必要採取數據庫脫機。使用此片段:

using (TransactionScope ts = new TransactionScope()) 
     { 
      try 
       { 
       ... 
       bank.setID(BankName, Branch); 
       throw new System.InvalidOperationException("sht happens"); 
       check.addCheck(check); 
       ... 
       ts.Complete(); 
       } 
      catch 
       { 
       //catch the exception 
       //ts.Complete() is not called, thus update/insert rollbacks 
       } 
     } 
+4

+1;哈哈在你的異常消息:) –