System i Access ODBC Driverを使用して、IBM Iseriesシステム上のdb2データベースを指すリンクサーバーを持つSQL Server 2012インスタンスがあります。
分散トランザクションを有効にしようとしています。このプロバイダーは IBMのドキュメント に従ってそれらをサポートしていると思います(そのリンクを誤解している場合を除きます)。
次のクエリを実行しています。
BEGIN TRANSACTION
UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE
SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION
次のエラーが発生します。
リンクサーバー "LINKEDSERVER"のOLE DBプロバイダー "MSDASQL"がメッセージ "[IBM] [System i Access ODBC Driver] Enlist with DTC phase failed。2"を返しました。メッセージ7391、レベル16、状態2、2行目リンクサーバー "LINKEDSERVER"のOLE DBプロバイダー "MSDASQL"が分散トランザクションを開始できなかったため、操作を実行できませんでした。
このエラーに関して私が行ったすべての調査は、分散トランザクションをdisableさせたいが、機能させたくない人々と出会いました。リンクサーバーのプロパティで[分散トランザクションのプロモーションを有効にする]をtrueに設定しました。
これを機能させる方法はありますか?
編集:詳細情報/更新。私はこれをあきらめて、助けを待つ準備ができていました。Windowsログでこれに気づいたとき:
XAトランザクションが無効になっているときに、呼び出し元がXAリソースを登録しようとしました。
MSDTCの設定を変更する方法を教えてくれた this link が見つかりました。設定を試してサーバーを再起動した後、動作が開始されました(種類)(特に、ネットワークDTCアクセスを有効にし、インバウンド/アウトバウンド/ XAトランザクションを有効にします)。
現在、クエリは実行され、期待どおりにコミット/ロールバックされますが、一部の時間には機能するように見えますが、それ以外の場合はエラーになります。エラーは:
リンクサーバー "LINKEDSERVER"のOLE DBプロバイダー "MSDASQL"がメッセージ "[IBM] [System i Access ODBC Driver] Internal driver error。"を返しました。
EDIT2:今ではもうまったく機能していません。エラーメッセージ:
リンクサーバー "LINKEDSERVER"のOLE DBプロバイダー "MSDASQL"がメッセージ "ODBCドライバーが新しいトランザクションを開始できませんでした。"を返しました。 OLEリンクサーバー "LINKEDSERVER"のDBプロバイダー "MSDASQL"がメッセージ "[Microsoft] [ODBC Driver Manager] Illegal operation while while a transaction server component transaction"を返しました。
ローカルDTCプロパティの設定に加えて、プログラムDistributed Transaction Coordinatorが通過できるように、両方のマシンでファイアウォールを開く必要があります。
クエリエディターウィンドウでT-SQLをテストする場合は、Microsoftの提案に従ってXACT_ABORTを必ずオンにしてください。
ほとんどのOLE DBプロバイダー(SQL Serverを含む)に対して暗黙的または明示的なトランザクションのデータ変更ステートメントに対してXACT_ABORTをONに設定する必要があります。このオプションが不要なのは、プロバイダーがネストされたトランザクションをサポートしている場合のみです。 。
DTCおよびSQL Browserサービスが正しいサービスアカウントで実行されていることを確認してください。
詳細な構成のヘルプについては、次のMS-BOLリンクも確認してください。
SQL Serverで分散トランザクションを使用するための推奨MSDTC設定
このツールを使用して、システムに適切なMSDTC構成があるかどうかを確認できます。
最後だが大事なことは
試行中のサンプルクエリをお知らせください。