ORA

最近ITネタが増えてきた気がするなぁと思いながら、書いてみます。
何気に、大規模開発というのに携わったことが(ほぼ)ないため、いわゆるエンタープライズレベルの仕組みってのにどうも疎い。

Oracleの2フェーズコミットはどこまで信頼できるのか?

がよく分かりません。
理論上は2つのDBでACIDを保証できるということですが、トランザクションマネージャTMと、A、BというDBがあったととして、

  • TM:準備はええか?(prepare)
    • A:更新準備OK
    • B:更新準備OK
  • TM:いっけぇーー(commit)
    • A:コミットぉぉぉ→コミット完了
    • B:コミットぉぉぉ→コミット完了

だとして、1フェーズ目でこけたり、どいつかが準備OKを返さなければタイムアウトしてロールバックされるっぽいのは分かった。
2フェーズ目でAかBがこけてコミットが失敗すれば「やっぱやめーー」ってロールバックされそうな気はする。(もしかしてここでこけたらすでにアウト?という気もするが、天下のOracleに限って、そんなやわじゃないだろうと勝手に解釈)
んじゃ、AもBもコミット完了してコミット完了って言おうとしたら、NW障害なんかで返せなかったとしたら、片方だけはコミットが完了したままの状態になって、もう片方はTMの「やっぱやめーー」でロールバックされてしまう気がする。
どうなんだろうか?

DBLINKがイマイチ分からん

上の問題を考えるに至ったそもそもがこれ。
あるDBから別のDBにDBLINKを張ると、アプリケーションからは透過的に、あたかも1つのインスタンス上にあるテーブルのように扱えるわけですが、ここでのトランザクション管理がよく分からんのです。
A、Bに更新かけてコミットをすると、やっぱり内部的には2フェーズコミットになるのか?
もしそうじゃないとしたらどういうことなんだろうか?
ちなみに、

  1. AとBでDBLINKを張ってクライアントでAに接続して、A、B両方のテーブルに更新をかける。
  2. コミットをかける前にBに接続して内容を確認する ⇒ 当然、更新前の状態が見える
  3. DBLINKをDROPする。A側からBのテーブルをSELECTをすると接続できないのでエラーになる。

じゃあ当然、コミットも失敗するだろうと思ったら、コミットは成功する。そしてBの内容が更新されてる。トランザクション管理とDBLINKはやっぱり別物で、DBLINKはあくまでアプリの都合に合わせたもので、トランザクション管理はトランザクションマネージャが管理していて、2フェーズコミットをしているのだろうか?と思ったわけです。

Oracleマスターの勉強しようかなぁ。