1

最初にいくつかの CRUD 操作 (DataBase でいくつかの行を挿入および更新するトランザクション) を実行し、トランザクション全体 (XML )。

XML を取得したら、その XML を Web サービスに送信します。この Web サービスは、私のシステムを統合するために顧客が公開するものです。

重要なのは、ある日、私の顧客が公開している WS が、その IT エリアが実行する週次または月次のサポート タスクのために機能しなくなったと想像してみましょう。 WS を呼び出そうとした瞬間に例外が発生しました。

インターネットで検索した後、Transaction Scope について考え始めました。データ アクセス レイヤーにあるデータ アクセス メソッドには、挿入、更新、削除などを実行する TransactionScope が既にあります。

次のコードは、私が試してみたいものです:

    public void ProcessSomething()
    {
        using (TransactionScope mainScope = new TransactionScope())
        {
            FooDAL dl = new FooDAL();

            string message = dl.ProcessTransaction();

            WSClientFoo client = new WSClientFoo();

            client.SendTransactionMessage(message);

            mainScope.Complete();

        }
    }

public class FooDAL
{
    public string ProcessTransaction()
    {
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions(){ IsolationLevel = IsolationLevel.ReadCommitted}))
        {
            ///Do Insert, Update, Delete and According to the Operation Generates a message

            scope.Complete();
        }

        return transactionMessage;
    }
}

問題は、私がやりたいことを処理するために TransactionScope を使用するのは正しいですか?

お時間をありがとうございました:)

4

1 に答える 1

0

TransactionScopeOption.RequiredFooDAL.ProcessTransaction メソッドでは、実際には次のことを意味します。利用可能なトランザクションがある場合は、このスコープで再利用します。それ以外の場合は、新しいものを作成してください。

要するに、はい、これが正しい方法です。

ただし、FooDAL.ProcessTransaction で scope.Complete() を呼び出さない場合、mainScope.Complete() への呼び出しは「TransactionAbortedException」などでクラッシュすることに注意してください。これは理にかなっています: ネストされたスコープがそれを決定した場合トランザクションをコミットすることはできません。外側のスコープはそれをコミットできないはずです。

于 2014-01-28T16:21:54.093 に答える