業務アプリケーションにデータベース処理はつきもので、
さらにデータベース処理には、トランザクションがつきもので、
またまたトランザクション処理にはコミットと、ロールバックが・・・
今まではどんな言語を使うにしろ、トランザクション処理では、
トランザクションの開始と、コミット、そして例外時にはロールバックと
明示的に記述していた。
C#で、SqlTransactionを利用した従来の書き方
using (SqlTransaction tran = con.Begin.Transaction())
{
try {
//SQLによるデータベース更新処理
:
//コミット
tran.Commit();
}
catch {
//ロールバック
tran.Rollback();
}
}
しかし.NET Framework2.0ではもう少し簡単に書けるようになった、
System.Transaction.TransactionScopeクラスが用意されている。
TransactionScope.Complete()メソッドが呼ばれるとコミットされ、
TransactionScope.Dispose()メソッドが呼ばれるとロールバック
される仕組みとのこと。
なので、usingステートメントと組み合わせて、以下のように書ける。
using (TransactionScope tran = new TransactionScope()) {
//SQLによるデータベース更新処理
:
//コミット
tran.Complete();
}
※例外が発生したり、Complete()メソッドを呼び出さずに、
usingステートメントを抜けると自動的にロールバックされる。
また、TransactionScope クラスには自動的にコネクションや、
SqlCommandクラスを検出する機能があるため、今までのように
明示的にコネクションやSqlCommandのインスタンスとトランザクション
のインスタンスを結びつける必要が無くなっているのもポイント。