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フェーズコミットになるのか?
もしそうじゃないとしたらどういうことなんだろうか?
ちなみに、
- AとBでDBLINKを張ってクライアントでAに接続して、A、B両方のテーブルに更新をかける。
- コミットをかける前にBに接続して内容を確認する ⇒ 当然、更新前の状態が見える
- DBLINKをDROPする。A側からBのテーブルをSELECTをすると接続できないのでエラーになる。
じゃあ当然、コミットも失敗するだろうと思ったら、コミットは成功する。そしてBの内容が更新されてる。トランザクション管理とDBLINKはやっぱり別物で、DBLINKはあくまでアプリの都合に合わせたもので、トランザクション管理はトランザクションマネージャが管理していて、2フェーズコミットをしているのだろうか?と思ったわけです。
Oracleマスターの勉強しようかなぁ。