[C#] TransactionScope の使い方

[C#] TransactionScope の使い方

TransactionScope とは

TransactionScope クラス (System.Transactions) | Microsoft Docs

TransactionScope とは、コードブロック内の処理をトランザクション処理にしてくれるものです。NET Framework 2.0 から利用することができます。

TransactionScope クラスを使用するとコードブロック内の処理で Complete() が呼ばれるとコミットし、Complete() が呼ばれることなくブロックを抜けると自動でロールバックしてくれます。

実装例と解説

例えば SqlConnection を使ってデータベースに接続して更新内容をコミットするには以下のように実装します。

using (var scope = new TransactionScope())
{
    using (var connection = new SqlConnection(@"[接続文字列]"))
    {
        connection.Open();
        
        // データ更新等のクエリを実行
        // ..
    }
    // Complete() が実行されるとコミット
    scope.Complete();
}
// Complete() が実行されていないとロールバックされる

まず、TransactionScope を使用するには System.Transactions を参照する必要があります。

TransactionScope を生成し、それを using で包みます。この using ブロック内がトランザクション処理の対象となります。自分で明示的にトランザクションオブジェクトを生成する必要はありません。

あとはブロック内でデータベースに接続し、お好きなように更新を行います。

最後にトランザクションスコープ内での処理が正常に完了したことを通知するために Complete() を呼び出します。この処理が呼ばれるとコミットされ、逆に呼ばれずに using ブロックを抜けると自動でロールバックされることになります。

つまりエラーが発生すると Complete() が呼ばれずに using を抜けるため、自動でロールバックされてくれるということです。

TransactionScope を使わない場合だと以下のようにトランザクションオブジェクトを生成して、明示的にコミット/ロールバックを実行する必要があります。

using (var connection = new SqlConnection(@"[接続文字列]"))
{
    connection.Open();
    using (var transaction = connection.BeginTransaction())
    {
        try
        {
            // データ更新等のクエリを実行
            // ..
            transaction.Commit();
        }
        catch (Exception)
        {
            transaction.Rollback();
        }
    }
}

注意点

使用上の注意点です。

トランザクションスコープを生成してからコネクションを開く

トランザクションスコープを先に生成し、そのあとでDBへのコネクションを開くという手順で実装しないと、トランザクションが効きません。

// NG例
using (var connection = new SqlConnection(@"[接続文字列]"))
{
    connection.Open();
    using (var scope = new TransactionScope())
    {
        // 接続してからトランザクションが効かない
        scope.Complete();
    }
}

どこかで同じデータベースへの接続がすでに開いていると、トランザクションが効かないので注意しましょう。

参考URL

C#カテゴリの最新記事