私はDBAではありません。Oracleのマルチバージョン同時実行モデルについて知りたいだけです。
DML操作を開始するとき、MVCCプロトコルの最初のステップはUNDOセグメントをバインドすることです。問題は、なぜ1つのUNDOセグメントが1つのアクティブなトランザクションにしか対応できないのかということです。
お時間をいただきありがとうございます~~
マルチバージョン同時実行は、Oracleに関して把握するためのおそらく最も重要な概念です。DBAになりたくない場合でも、プログラマーがそれを理解するのは良いことです。
これにはいくつかの側面がありますが、それらはすべて効率に帰着します。UNDO管理はオーバーヘッドであるため、それに費やされるサイクル数を最小限に抑えることで、データベースの全体的なパフォーマンスに貢献します。
「なぜ1つのUNDOセグメントが1つのアクティブなトランザクションにしか対応できないのですか?」
これは単に設計上の決定です。これが、undoセグメントが機能するように設計されている方法です。以前のロールバックメカニズムで発生する可能性のある問題のいくつかに対処するために行われたと思います。
ロールバック(まだ使用可能ですが、元に戻すために非推奨)には、DBAによるロールバックセグメントの明示的な作成が含まれ、複数のトランザクションを単一のロールバックセグメントに割り当てることができます。これにはいくつかの欠点がありました。最も明らかなのは、特定のセグメントに割り当てられた1つのトランザクションが、セグメントがいっぱいになる(そして拡張できなくなる)十分なロールバックデータを生成した場合、同じセグメントを使用する他のトランザクションは、生成する操作を実行できなくなることです。データをロールバックします。
新しい取り消し機能の設計目標の1つは、この種のトランザクション間の依存関係を防ぐことだったと思います。したがって、彼らはDBAがUNDO表領域のサイズを決定して作成するようにメカニズムを設計しましたが、その中のセグメントの管理はOracleによって内部的に行われます。これにより、トランザクションごとに専用セグメントを使用できます。表領域がいっぱいになった場合(および自動拡張できない場合)、これらは相互に問題を引き起こす可能性がありますが、セグメントレベルでは、あるトランザクションが別のトランザクションに問題を引き起こす可能性はありません。