2011-07-20 1 views
0

私は、Oracleデータベースに接続されている多層MVVM WPFアプリケーションをやっています。 TransactionScopeについての説明が必要です。次の例を考えてみましょう:データベースを更新するためにC#を使用しているトランザクション

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

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

このコードは、説明のみのためである:addCheckが実際にレコードを挿入しながらbank.setID()は、レコードを更新。私はこれをテストする方法を理解できませんでした。 2番目の方法で挿入する前に、データベースの更新とシャットダウンを実行して、更新がロールバックされているかどうかを確認します。これはすでに正しいですか?正しい軌道にいるのですか?これはTransactionScopeの目的ですか?事前に

おかげ

答えて

2

編集:あなたがDBトランザクションを理解している場合、私はので、ここで非常に簡単な説明ですが、最初はわからなかった。

TransactionScopeは、その機構をdatabase transactionを包むように設計されていますexception safeです。

atomicのトランザクションセットをトランザクションにラップするために使用します。したがって、1つの更新に失敗すると、そのトランザクション内のすべてのDBアクションがロールバックされます。あなたのコードが例外をスローした場合、トランザクションはロールバックされ、代わりにデータベースにコミットされますように

あなたはusingブロックでそれを使用しています。

は、私は右のトラックにアム...第二の方法で挿入する前に、アップデートとシャットダウンデータベースを実行して、更新がロールバックされるかどうかを確認したいですか?

うん。あなたのコードは、すでにそれを処理する必要があります

  • DBがaddCheckは、挿入を行う前に、例外がスローされますので、[挿入は例外
  • をスローする必要がシャットダウンされている場合は、Complete
  • と呼ばれることはありません飽きないはずです(隠された)finallyブロックに到達した、とComplete

と呼ばれていない場合finallyブロックは自動的にトランザクションをロールバックする必要があります私はあなたのコードのためのユニットテストを書きたいならば、私は、「実行の途中でDBをオフラインにする」アプローチを示唆しています、この

をテストする方法を見つけ出すことができませんでした。

代わりに、私は別のDBを指すのに十分なあなたのDBのロジックが柔軟にお勧めしたいです。次に、addCheckが挿入するテーブルまたは一部の列を削除します。 setIDが成功するようにDBを設定してください。ただし、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;あなたの例外メッセージでLOL :) –

関連する問題