2012年3月3日土曜日

TransactionScopeのComplete

TransactionScopeって便利だなーと思って使用していたら、
予想とは違う動作をしたので、焦って調べ直した。


勘違いポイント
<Complete=コミットではない>
Completeはあくまでも、コミットする準備ができたと明示的に書くだけであり、
コミットするのはUsing句を終了するときである。
コミットできないときはUsing句の終了で例外が発生する。
よって、TransactionScopeはtry&catchで囲む必要性が高そうだ。


            using (var tran = new TransactionScope())
            {
                try
                {
                    //
                    // データアクセス関連の処理
                    //


                    tran.Complete();


                }
                catch (Exception)
                {
                    // 例外処理
                    throw;
                }
            }



よりは




            try
            {
                using (var tran = new TransactionScope())
                {
                    //
                    // データアクセス関連の処理
                    //


                    tran.Complete();


                }
            }
            catch (Exception)
            {
                // 例外処理
                throw;
            }

のほうが現実的な気がする。

0 件のコメント:

コメントを投稿