2009/11/28

RACでの分散トランザクション

RACで分散トランザクションを行う場合は、同じ分散トランザクションの異なるブランチはかならず1つのインスタンスに置くように処理を転送する必要がある

同じ分散トランザクションの異なるブランチがRACデータベースの異なるインスタンスに置かれる状態をスプリット・ブランチといい、スプリット・ブランチが発生すると分散トランザクションは正しく処理されない。

スプリット・ブランチを避けるためには、優先インスタンスを1つだけ持つシングルトン・サービスを作成する。






参考:RACでXAを使用するためのベスト・プラクティス
http://otndnld.oracle.co.jp/products/database/clustering/pdf/bestpracticesforxaandrac.pdf

MSDTCの罠

MSDTCはコミットフェーズのシーケンスにちょっとした罠があり、見事にはまったのでメモ。









































準備フェーズで全てのリソースマネージャから準備完了のメッセージを受信したら、コミットフェーズでアプリへのコミット通知とリソースマネージャーへのコミットメッセージの送信を非同期に行う。

そのためアプリにコミット通知を行ったはいいが、図中の③、④のポイントで障害が発生すると不確定区間のためインダウト トランザクションとして残ってしまう。

アプリとしてはMSDTCからコミットを受けているので正常フローするが、実際はトランザクションがコミットされず、インダウト トランザクションとしてリソースをロックし続けている状態になってしまう。