5

C# である種のトランザクションを処理する簡単な方法があるのだろうか。2 つのプロパティがあり、それらの値を更新したいとします。次のように書くことができます。

A = GetA();
B = GetB();

問題は、B の割り当て中に例外がスローされると、A が更新されているため、オブジェクトが一貫性のない状態になることです。A の現在の値を保存し、B を処理するときに例外をキャッチすることで、これを解決できます。

var tempA = A;
A = GetA(); // A is up to date
try { B = GetB(); } catch { A = tempA; } // B is up to date also or A is reverted

上記の解決策でも、A を元に戻すときに例外がスローされる可能性があるため保存されませんが、ポイントは、.NET にそのような操作を単純化するメカニズムが組み込まれている場合ですか?

以下のような文が想像できます。

transaction { A = GetA(); B = GetB(); }

または、次のようなコード構成:

Transaction.Enter();
A = GetA();
B = GetB();
Transaction.Leave();

トランザクション前にマシンの状態が保存され、トランザクション後に例外が発生した場合に元に戻されます。.NETにそのようなものはありますか?

4

3 に答える 3

4

TransactionScope クラスを使用できます。

例:

using(var scope = new TransactionScope())
{
    DoAction1();
    DoAction2();

    scope.Complete();
}
于 2013-07-29T12:58:07.933 に答える