• 締切済み

ADO接続のトランザクション処理

SQL2005のDBに対して ADOのconnectionオブジェクトで接続しているのですが、 下記のようにトランザクションを開始し、SQLを実行し、 エラーが発生してロールバックを行っていない場合、 2個目のSQLがいつまでたってもロック状態でタイムアウトになりません。 このような場合、ADOconnectionのコマンドタイムアウトのデフォルト値30秒で タイムアウトとなり、ロールバックされないのでしょうか? 以下adoコネクションオブジェクトをConnobjと表記します Connobj.BeginTrans Connobj.Execute "Insert into AAA・・・・" ← このInsert文で失敗 Connobj.Execute "Update BBB SET ・・・・" ← このUpdateは成功 ※ロールバックもコミットも行わない  (プログラムの不具合でロールバックができなかった場合や、  アプリで異常が発生してロールバックが行えない等) お手数をおかけしますが、何かご存知の方、ご教授願います。

みんなの回答

回答No.5

CommitTransなり、RollbackTransを例外処理と組み合わせて使わないとですね。

  • 0909union
  • ベストアンサー率39% (325/818)
回答No.4
  • 0909union
  • ベストアンサー率39% (325/818)
回答No.3

コマンドのエラーで起きるなら、スクリプト行レベルでトラップを掛けるといいでしょう。他の方が提示していますね。 しかし、 >2個目のSQLがいつまでたってもロック状態でタイムアウトになりません >コマンドタイムアウトのデフォルト値30秒でタイムアウトとなり、ロールバックされないのでしょうか の問題であれば、DBMSレベルでトリガーでトラップを掛ける必要があります。 マニュアルや、リファレンスを参照してください。OracleならPL/SQLなどですよね。 また、GUIレベルのプロパティーに、タイムアウトの設定かがあったかと思います。 どちらかを選択することになります。 http://msdn.microsoft.com/ja-jp/library/938d9dz2(v=vs.80).aspx http://msdn.microsoft.com/ja-jp/library/938d9dz2.aspx http://msdn.microsoft.com/ja-jp/library/ms189799.aspx http://www.google.co.jp/search?hl=ja&q=SQLServer+%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A&lr=lang_ja いずれにせよ、トリガーなどは自身でトラップに引っかかりやすいので、限定する項目を精査して、設定する必要があります。 (システムのタイムアウトイベントをトリガーとしてするのか、実行からWait時間で取得値の有無でトリガーとするのか、またロールバックが必ずしもよいとはいえない)

sin201102
質問者

お礼

ありがとうございます。 通常、トランザクション処理を行う場合、 教えていただいたトリガー等でロック解除用のものを用意するんでしょうか? ADOかSQLServerのコマンドタイムアウトで ロールバックがかかると思っていたのですが・・・・ 知識が浅く、とんちんかんな質問をしていたら申し訳ないです。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

言語は何をお使いですか? ~VB6、VBAなら Connobj.BeginTrans実行の前に「On Error Goto ラベル」でエラー処理に飛ばして、そこで「Connobj..RollbackTrans」を行えばいいと思うのですが。 VBAなどでは、「On Error Goto ラベル」宣言せずに実行中エラーが発生すると「終了」「デバッグ」のユーザ入力待ちになって固まってしまいます。

sin201102
質問者

お礼

ありがとうございます。 ASPなのでVBAです。 ADOコネクションオブジェクトにセッションスコープを与えて利用しています。 かなり以前に作成されたプログラムで、 最近ロックが残ったままとなる現象が発生し、 調査したところ、トランザクション処理を行っているASPで On Error Goto の記述が抜けており、ロールバックすることが出ていませんでした。 「終了」「デバッグ」のユーザ入力待ちとありますが、 この間もコマンドタイムアウト(SQLSERVER側も?)が発生せずに、 ロックが残ってしまうのでしょうか?

  • marutone
  • ベストアンサー率40% (70/174)
回答No.1

トランザクション開始後のInsert文が失敗した時点で、 try~catch等を使用してエラーハンドリングをし、 ロールバックを行うという方法が正しいです。

sin201102
質問者

お礼

ありがとうございます。 エラー処理が不十分でロールバック処理が行えず Update文のロックが残ったままとなってしまってました。

関連するQ&A