2.2.8 分散トランザクションの単一フェーズコミット最適化
MSDTC連携機能では,トランザクションの単一フェーズコミット最適化を行うことができます。単一フェーズコミット最適化とは,トランザクションに参加するリソースがOpenTP1のリソース一つだけである場合に,単一フェーズコミットを行う機能です。トランザクションに参加するリソースが複数ある場合は,自動的に2相コミットを行います。
単一フェーズコミット最適化を行う場合は,<distributedTransaction>要素のoptimize1PC属性にtrueを指定してください。falseを指定した場合,トランザクションに対して常に2相コミットが行われます。
(1) 単一フェーズコミット最適化を使用する場合
単一フェーズコミット最適化を使用する場合で,トランザクションに参加するリソースがOpenTP1のリソース一つだけであるときは,単一フェーズコミットが発行されるため,処理が簡略化されます。
ただし,次に示す内容を考慮して単一フェーズコミット最適化を使用してください。
-
単一フェーズコミット最適化を使用する場合に,OpenTP1のリソースがトランザクションに参加した時点でほかのリソースが一つも参加していないと,MSDTCのDIDがOpenTP1に通知されません。そのため,OpenTP1が管理するトランザクションを強制決着する際に,MSDTCが管理するトランザクションと照合できないことがあります。
-
単一フェーズコミット最適化を使用する場合で,単一フェーズコミットを行う際にOpenTP1に対して通信エラーが発生したときは,アプリケーションでSystem.Transactions.TransactionInDoubtException例外が発生します。このときトランザクションがコミットまたはロールバックされたかは不明となります。
(2) 単一フェーズコミット最適化を使用しない場合
単一フェーズコミット最適化を使用しない場合は,MSDTCのDIDが常にOpenTP1に通知されます。このため,トランザクションの強制決着を行う場合などに,MSDTCとOpenTP1のトランザクションのステータスを照合できます。
ただし,常に2フェーズコミットが行われるため,トランザクションに参加するOpenTP1のリソースが一つであっても,単一フェーズコミット最適化を行う場合に比べて通信回数が増加します。