2016-05-26 17 views
1

私は「Microsoft SQL Server 2012(SP3)」データベースにいくつかのSPを持っています。 これらのSPは、VB6アプリケーションと他のSP、または.Netアプリケーションから呼び出される可能性があります。TSQL - 分散トランザクションまたはローカルトランザクション?

SPが他のSPまたはVB6アプリケーションから呼び出された場合、エラーまたは無効な入力の場合には、現在のトランザクションをロールバックしてraiserrorで適切なエラーメッセージを表示できます。

しかし、複数のWCFサービスは、(それが会社の標準である、我々はMS DTCを使用)を関与している場合、私は、トランザクションをロールバックしてはならないと私は唯一べき .NETアプリケーションによって開かれた接続が分散トランザクションにフックされているので、 raiserrorコマンドを呼び出します。

我々は分散トランザクションをロールバックする場合は、raiserrorコマンドを使用して発生したすべてのエラー・メッセージが失われたと.NET側で我々はそのメッセージで例外を取得しています

Microsoft分散トランザクションコーディネータ(MS DTC) は、私が分散トランザクションにまたはSPの内部にコーディングしながら、私はローカル・トランザクションにいる場合だ場合

はどのように知ることができる分散トランザクションをキャンセルしたのか?分散トランザクション中の場合、私はロールバック文を実行しません。

ご協力いただければ幸いです。同じ問題に直面したもののため

+0

多分、このスレッドは、うまくいけばうまくいけばそれほど古くはありませんhttp://stackoverflow.com/questions/2919018/in-sql-server-how-do-i-know-what -transaction-mode-im-currently-using – Petaflop

+0

また、あなたが持っているこれらのSPの数はわかりませんが、ロールバックする必要があるかどうかを示すために、それぞれのパラメータを持つことができます – Petaflop

+0

@MSANZありがとう、私はすでにこのスレッドを訪れましたが、分散トランザクションについては役に立ちませんでした。これは、暗黙的でない明示的なトランザクションモードだけを示すことができます。各SPにパラメータを追加することについては、膨大な数のSPと、SPが他のSPへのサブスクリプションコールを行うため、事実上不可能です。私は、SPを却下するトランザクションが呼び出されるパスを知ることができないので、すべてのSPにそのパラメータを追加し、後続のすべてのコールにその値を伝播する必要があります。 –

答えて

0

、私は一時的な解決策を見つけた:

私はsys.dm_tran_session_transactionsビューをチェックしています。

カラムis_enlistedは、.Netから来て、.Net側でmsdtcトランザクションを開始した場合にtrueになります。

編集:ビューsys.dm_pdw_nodes_tran_session_transactionsはAzure SQLデータベースで使用されています(クラスタ化されたインストールでも有効です)。sys.dm_tran_session_transactionsは他のエディションでも使用されています。だから私は使用する答えを編集しましたsys.dm_tran_session_transactions