ADO の トランザクションのステイタスについて


Con  2009-04-20 10:02:56  No: 101664  IP: 192.*.*.*

VB6.0 ADO で  DB  捜査しています。

コネクションのDBに対して、

トランザクションがかかっているか、いないかを判別したいです。

ステイタスを取る方法はあるのでしょうか?

編集 削除
オショウ  2009-04-20 13:37:43  No: 101665  IP: 192.*.*.*

わざわざトランザクションによるリソースのロックが
為されているかどうか・・・確認する必要があるので
しょうか?

その為にトランザクションをかけていると思うのです
が・・・

トランザクション=リソースのロック
とするならば、間接的ですが、ロック状態を取得する
方法はあります。

sp_lock を調べてみて下さい。

http://meisterofcode.blog120.fc2.com/blog-entry-46.html

※  因みに、SQL Server? Oracleとかではないですよネ?

※  この辺、突っ込まれても詳しくないので、あしからず。

以上。

編集 削除
魔界の仮面弁士  2009-04-20 14:23:21  No: 101666  IP: 192.*.*.*

そういう判断をしなければならない状況にあるという時点で、
そもそもの設計に問題がある可能性がありますが、今回は
DB操作ではなく、DB捜査のようなので、仕方が無いのかな…。

---

Connection オブジェクトの BeginTrans/RollbackTrans/CommitTrans メソッドを
呼びだしているのであれば、汎用的には、それぞれのメソッド呼び出しに追従して、
BeginTransComplete/RollbackTransComplete/CommitTransComplete イベントが
発生しますので、それで管理できるかと思います。(WithEvents 変数を利用する)

この方法の場合、トランザクションの成否なども、イベント引数で判断することができます。
たとえば、トランザクションのネスト回数(BeginTrans メソッドの戻り値)は、
BeginTransComplete イベントの第1引数で判断できますし、トランザクションの成否などは
同イベントの第2、第3引数にて判断できます。
http://msdn.microsoft.com/ja-jp/library/cc408108.aspx


あるいは、新たにトランザクションを開始したのち、即座にチェックポイントにまで
復元して判断するという方法もあります。最大ネスト回数を超えて BeginTrans した場合には、
  #DEFINE XACT_E_XTIONEXISTS _HRESULT_TYPEDEF_(0X8004D013L)
のエラーが発生しますので、それをエラートラップもしくは先述のイベント引数で
エラー番号が &H8004D013 にあたるものを拾うというものです。

ちなみに、トランザクション無しにコミット/ロールバックを行った場合には、
  #define XACT_E_NOTRANSACTION _HRESULT_TYPEDEF_(0x8004D00EL)
が発生し、そもそもトランザクションをサポートしていない場合においては、
  #define XACT_E_NOTSUPPORTED _HRESULT_TYPEDEF_(0x8004D00FL)
のエラーが発生しますので、これらも併せてチェックした方が良いかと思います。


問題は、データベース側はトランザクションをサポートしているのに、接続に使った
OLE DB プロバイダが、トランザクションをサポートしていない場合の判断方法でしょうね。
もし、connection.Properties("Transaction DDL").Value が DBPROPVAL_TC_NONE (=0) を
返す場合(OLE DB プロバイダ側がトランザクションをサポートしていない場合)には、
直接、SQL コマンド等でトランザクションを管理する必要が生じるかと思います。
(この場合は汎用的な取得方法はありません。各データベースごとに異なる手段が必要です)

編集 削除
魔界の仮面弁士  2009-04-20 14:27:04  No: 101667  IP: 192.*.*.*

書き忘れ。

> 新たにトランザクションを開始したのち、即座にチェックポイントにまで
> 復元して判断するという方法もあります。

このとき、トランザクションのネスト数(BeginTrans メソッドの戻り値、
もしくは、BeginTransComplete イベントの TransactionLevel 引数)が
1 を返せば、トランザクションが発生していなかったことを意味します。

一方、ネスト数として 2 以上が返されたり、あるいは
  #DEFINE XACT_E_XTIONEXISTS _HRESULT_TYPEDEF_(0X8004D013L)
が発生したりすれば、何らかのトランザクション処理中であるという事です。

編集 削除