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();
}
}
どこかで同じデータベースへの接続がすでに開いていると、トランザクションが効かないので注意しましょう。
コメントを書く