私は、リンクサーバーからデータを引き出す必要があるストアドプロシージャを呼び出すマルチスレッドスケジューラプロセス(.NET)ローカルテーブル。私は明示的にトランザクションを使用していません - 私は再実行できるので、プロセスが失敗したことには関心がありません。さらに、分散トランザクション(MSDTC)の複雑化を避けたい。私はSQL Server Management Studioのからストアドプロシージャを実行リンクされたサーバーに関連するクエリは、トランザクションが使用されていないときに分散トランザクションエラーを発生させます。
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction.
OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "No transaction is active.
は、それがない:
私は何に実行していることは、.NETプロセスを通してほとんどの時間は、私は次のエラーを取得していますということですエラーは発生しません。私はSSMSの実行が.NETとどのように違うのかを追跡しようとしていましたが、.NETプロセスがエラーを受け取らないインスタンスがいくつか見つかりました。しかしそれでも、失敗したときと失敗したときとを区別することはできません。
@@trancount
を記録する手順にいくつかのログを記録しました。これは常に2として登録しています。ログを保存するためにINSERT
ステートメントをカバーする1つの暗黙のトランザクションを理解できますが、 。それが価値のあるものであれば、私のストアドプロシージャは実際にリンクされたサーバーにアクセスする第2のプロシージャを呼び出します。つまり、@@trancount
は成功した場合でも2を返します(SSMSまたは.NETから呼び出された場合でも関係なく)。
DBAは、リンクされたサーバーのプロパティを変更して、「分散トランザクションのプロモートを有効にする」が偽であることを確認しました。もう何を試してみるべきですか?ありがとう!
IIRCの場合、これはLinkedServerの定義に問題があるか、ローカルまたはリモートのSQL Server上にMSDTCがセットアップされているために発生します。私はこれをhhtp://dba.stackexchange.comに持ち込むことをお勧めします。ここには詳細を知っているかもしれないDBAがいます。 – RBarryYoung
また、この質問には多くの有益な情報があります。https://stackoverflow.com/questions/7473508/unable-to-begin-a-distributed-transaction – RBarryYoung
そしてここには:https://stackoverflow.com/questions/18657768/OLE-db-provider-sqlncli-for-linked-to-begin-a-distributed-tr- – RBarryYoung