• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLServer2005 リンクサーバーのトランザクションについて)

SQLServer2005 リンクサーバーのトランザクションについて

このQ&Aのポイント
  • SQLServer2005のリンクサーバーにおいてトランザクションが正しく処理されない場合の解決方法について教えてください。
  • インスタンスAとインスタンスBがあり、インスタンスAにリンクサーバーとしてインスタンスBを登録しています。インスタンスAにデータをインサートすると、トリガーXによってインスタンスBのテーブルにもデータがインサートされます。しかし、制約違反が起きた場合、インスタンスBのデータがロールバックされずにコミットされてしまいます。この問題を解決する方法を教えてください。
  • SQLServerのリンクサーバーを使用してトランザクション処理を行っています。インスタンスAにデータをインサートすると、トリガーXによってインスタンスBのテーブルにもデータがインサートされます。しかし、制約違反が起きた場合、インスタンスBのデータがロールバックされずにコミットされてしまいます。この問題に対する解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

Javaは使っていないのですが、リンクサーバに関する限り同様の環境で試してみても、そのような事象は確認できませんでした。 したがってあくまで推測の域ですが、ポイントはリンクサーバ側というよりもJDBC側ではないでしょうか? とりあえず、以下のあたりをお勧めします。 ・SQL Server単体で実行して、本当にロールバックされないか試してみる。  BEGIN TRY  BEGIN TRAN  INSERT INTO テーブルa values (...) -- 正常終了するもの  INSERT INTO テーブルa values (...) -- 制約違反が生じるもの   COMMIT TRAN  END TRY  BEGIN CATCH  ROLLBACK TRAN  END CATCH ・以下のページをチェックして、JDBC経由でのMSDTCが正しく機能しているか確認する。  http://msdn.microsoft.com/ja-jp/library/ms378931(SQL.90).aspx

toushiro09
質問者

お礼

ご回答大変ありがとうございます。 ・SQL Server単体で実行して、本当にロールバックされないか試してみる。 試してみたところ、同様にロールバックされませんでした。 ・以下のページをチェックして、JDBC経由でのMSDTCが正しく機能しているか確認する。 MSDTCの「XA トランザクションを有効にする」のチェックが入っていませんでしたので、チェックを入れMSDTCを再起動した後、インスタンスAとB共にサービスを再起動しました。 そして確認として、JDBCを経由せずに直接インサート文を発行し、試してみましたところ、依然とロールバックされない状況です。 残念ながらJAVA側のソースを書き換えるという手段が取れない状況でして、諦めてSQL CLRのTransactionScopeを使用した実装に書き直そうかと思っています。 ※SQL CLRのTransactionScopeを使用した実装ではロールバックされることを確認しました。 大変ありがとうございました。

toushiro09
質問者

補足

申し訳ありません。再度検証したところ、動作結果が違いました。 以下のとおりです。 インサートするデータの中身: 1件目:正常データ 2件目:制約違反が起きるデータ 3件目:正常データ このデータのパターンでJDBC経由とT-SQL単体での確認を行いました。 JDBC経由での結果: 3件目が登録されてしまう 2件目でエラーとなり2件目までロールバックされるが、 3件目が別トランザクションとして処理されている? T-SQLでの結果: 3件目が登録されない 2件目でエラーとなりロールバックされ、 処理が終了していると考えられる (T-SQLの記述内容)  BEGIN TRY  BEGIN TRAN  INSERT INTO テーブルa values (...) -- 正常終了するもの  INSERT INTO テーブルa values (...) -- 制約違反が生じるもの   INSERT INTO テーブルa values (...) -- 正常終了するもの  COMMIT TRAN  END TRY  BEGIN CATCH  ROLLBACK TRAN  END CATCH ですのでjamshid6さんのご指摘のとおり、 JDBCの処理方法の問題ということがわかりました。 ありがとうございます&失礼いたしました。

関連するQ&A