iPhoneアプリ
2006-06-08 技術メモ
SQL Server 2000でのコネクション/トランザクション問題
注意 :
本件は以下の環境で発生したものです。
全ての環境で発生するとは限りません。
- SQL Server 2000
- VisualStudio .NET 2003
- .NETのコードでトランザクションを管理している
- .NETから呼ばれるストアドでもトランザクションを管理している
アプリケーションからストアドを実行する場面で次のようなエラーが発生することがありました。
Code:266
Message:
EXECUTE 後のトランザクション数は、 COMMIT TRAN または ROLLBACK TRAN ステートメントに間違いがあることを示しています。以前の数 = 1、現在の数 = 0 です。
このケースはアプリケーションとストアドでトランザクションがネストしており、ストアド内でROLLBACKが発生した場合です。
コネクション確立(C1)
トランザクション開始(C1:T1)
■ストアド
トランザクション開始(C1:T2)
ロールバック(T2) …★例外発生
トランザクション終了(T1)
コネクション切断(C1)
同一のコネクションでトランザクションがネストしているためロールバックに失敗するようです。たとえトランザクション名を指定しても。*1
この場合はセーブポイントを設けてセーブポイント名でロールバック、かつロールバック後にコミットも発行*2することで例外発生を回避できました。
しかし、これではストアドのコードが釈然としない、というか独立性が損なわれるので、出来れば別の解決をしたいものです。
とりあえずトランザクションをネストしないのが一番良いです。というか、始めからそうしろと思うのですが、色んな大人の事情などで今回はそうできませんでした。
ですのでコネクションを別々にすることにしました。構成は次のようになります。
コネクション確立(C1)
トランザクション開始(C1:T1)
コネクション確立(C2)
■ストアド
トランザクション開始(C2:T2)
ロールバック(T2) …★問題解消
コネクション切断(C2)
トランザクション終了(T1)
コネクション切断(C1)
これだとストアドの構成は特に変更しなくても良いです。
アプリケーション内でコネクションの確立がネストしていますが、C2の確立〜切断まではモジュールとして独立しているので特に意識しなくても良い(はず)です。
ただしあくまでも別々のコネクションですので、C1で取得したロックの影響でC2が失敗する恐れがある、というかデッドロックなど起こさないよう細心の注意が必要です。
そう考えるとこの解もイマイチだなぁー。
ただ独立した処理だからストアドになってるハズなので大丈夫とは思いますが…。
追記
KHさんのコメントで教えていただいたサイトを見てみました。
・・・英語だ!
でもファンタジスタがパスで会話できるようにプログラマならコードで会話ができるので大丈夫♪
-- Normal exit
IF @@TRANCOUNT > 0
COMMIT
RETURN(0)
-- Error Exit
ErrExit:
IF @@TRANCOUNT > 1
COMMIT
ELSE
IF @@TRANCOUNT = 1
ROLLBACK
RETURN(-1)
ふみゅ。おバカな私はマトリックスで表さないとよく解りません♪
| トランザクション数 | 0 | 1 | 2以上 |
| Normal Exit | (NOP) | COMMIT | COMMIT |
| Error Exit | (NOP) | ROLLBACK | COMMIT |
トランザクション数が複数の場合はエラーでもCOMMITを発行するのですか!?
ちゃんとストアド内の処理がキャンセルされているのか不安で仕方ありません。
たしかにここでROLLBACKすると例外が発生して困ってたのですけど…。
だ、大丈夫でしたか? > KHさん
結論
KHさんから詳細な検証内容を教えていただきました。
なるほど、これで正しいのですね。
- 内側のトランザクション
- Normal Exit時はCOMMIT
- Error Exit時はCOMMIT(ただし戻り値などで外側のトランザクションにエラーを通知)
- 外側のトランザクション
- 正常時はCOMMIT
- エラー時はROLLBACK
最終的な制御は外側のトランザクションが行えば良いということですか。
納得です (^_^) 感謝×2♪
![]()
ファンタジスタ (Number 1) (少年サンデーコミックス)
- 作者: 草場道輝
- 出版社/メーカー: 小学館
- 発売日: 2000/02
- メディア: コミック
- クリック: 27回
- この商品を含むブログ (31件) を見る
おまえのパスの声を聞かせてくれ
- 4 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=RNWE,RNWE:2005-22,RNWE:ja&q=女王の教室 めざめ
- 3 http://blog.livedoor.jp/umu/
- 3 http://d.hatena.ne.jp/keyword/anan
- 3 http://d.hatena.ne.jp/keyworddiary/週刊少年ジャンプ
- 3 http://www.google.co.jp/search?hl=ja&q=にこにこぷん&lr=
- 2 http://1470.net/bm/urlinfo/71029647
- 2 http://blog.goo.ne.jp/search/search.php?status=select&tg=all&ts=goo&st=time&dp=all&ts=all&da=all&PT=webtu&from=webtu&MT=陰からマモル
- 2 http://d.hatena.ne.jp/asin/4088736567
- 2 http://d.hatena.ne.jp/keyword/ムヒョ
- 2 http://reader.livedoor.com/reader/






