6


5

複数のデータベースにわたるトランザクションの実装

複数のデータベースでデータ変更を実行しています。すべての変更をカバーするトランザクションを実装したいと思います。

これは私が現在持っているものです:

try
{
    db[1].begintransaction();
    db[1].ExecuteNonQuery();

    db[2].begintransaction();
    db[2].ExecuteNonQuery();

    ...

    db[N].begintransaction();
    db[N].ExecuteNonQuery();

    // will execute only if no exception raised during the process
    for (int a = 0; a < N; a++)
    {
        db[a].Commit();// what if there is an error/exception here
    }
}
catch
{
    for (int a = 0; a < N; a++)
    {
        db[a].RollBack();
    }
}

問題は、 `+ Commit()+`の間に例外が発生すると、上記が恐ろしく失敗することです(コメントを参照)。 これを達成するためのより良い方法はありますか?

4 Answer


12


このように TransactionScopeクラスを使用してください。

using(TransactionScope ts = new TransactionScope()){//ここにすべてのdbコード

//エラーが発生した場合、usingブロックから飛び出して、破棄してロールバックします

ts.Complete(); }

TransactionScopeクラスは、必要に応じて自動的に分散トランザクションに変換します。


1


transactionScopeを使用するのがその答えです。 異なるDBMSでも動作します。

http://blogs.interakting.co.uk/post/Transactions-over-multiple-databases.aspx[複数のデータベースにわたる取引]


0


クレタスが言ったように、あなたはある種の Two-phase commitを必要とします。 記事が述べているように、これは必ずしも実際にはうまくいきません。 堅牢なソリューションが必要な場合は、トランザクションを順番に実行して個別にロールバックできるようにトランザクションをシリアル化する方法を見つける必要があります。

これはあなたが詳細を提供していない特定のケースに依存するので、私はあなたにこれをどう攻撃するかのアイデアを与えることはできません。


0


SQL Serverの複数のインスタンスでトランザクションを実行したい場合は、http://msdn.microsoft.com/en-us/library/ms684146(VS.85).aspx [Microsoft Distributed Transaction Coordinator]のドキュメントを参照してください。