ローカルデータベースにレコードを挿入し、(Oracle Database Linkを介して)リモートデータベースにレコードを挿入するアプリケーションコードがあります。この分散トランザクションをコミットすると、ローカルデータベースとリモートデータベースの両方が両方ともコミットするか、両方がロールバックすることが保証されますか、それともリモートデータベースはコミットできてもローカルコミットは失敗する可能性がありますか(またはその逆)?
1 に答える
Oracleが2フェーズコミット(2PC)プロトコルに相当するものを使用しない場合、私は驚かれることでしょう。これにより、両方のコミットまたは両方のロールバックが保証されます。
2PCには、コミット前フェーズと呼ばれる段階があります。この段階では、マスター(コーディネーター)インスタンスが自身の決定を記録し、すべての参加者にコミットの準備をするように指示します(そして、ステータスを報告します-失敗するか、コミットできます)。参加者はまた、コミットする準備ができており、(コミットできる場合は)コーディネーターにコミットする準備ができていることを伝えた後、コーディネーターからのさらなる指示を待ちます。すべての参加者が応答すると、コーディネーターは最終決定を記録し、その決定を参加者に送信し、その決定に基づいて行動します。マスターが決定を記録した後、参加者に決定を正常に送信する前に失敗した場合、参加者はコミットもロールバックもできない状態でハングアップする可能性があります。それから回復する方法があります。コーディネーターが十分な時間ダウンしている場合(たとえば、壊滅的なh/w障害の結果としてサービスが停止されます)問題が発生する可能性があります。参加者は、通常、ヒューリスティックなロールバック(推定ロールバック)を実行することになりますが、これには、問題を引き起こすために驚くほど不運が必要です。
2PCに代わるものがあります。最終的な結果は同じです-すべてのコミットまたはすべてのロールバック。