web-dev-qa-db-ja.com

Oracleデータベースでのコミットvs高速コミットvsコミットクリーンアウト

Oracleデータベースに関連するこれらの3つの用語の違いに関する私の理解を誰かが確認できるかどうか疑問に思っていました。

多くの情報源はこれらの用語を混同し、それらを詳細に説明していないため、情報を見つけるのは少し困難でした。

私が集めたものから:

  1. コミットと高速コミットはまったく同じものです。すべてのコミットは高速コミットです。
  2. 高速コミットは基本的に、トランザクションがコミットしたことを示すために、元に戻す/ロールバックセグメントヘッダーのトランザクションテーブルのフラグのみを更新します。ただし、実際のブロックは再検討されません。つまり、データブロックのヘッダーにある対象のトランザクションリスト(ITL)の取り消しバイトアドレス(UBA)は、対応する取り消しセグメントのトランザクションテーブルを指します。さらに、対応する行のロックバイトは解放されず、ITLのロックカウントは変更されません(行はまだロックされています)。
  3. コミットクリーンアウトでは、ブロックisに再度アクセスし、ITLがコミットSCNで更新されます。ただし、ITLのロックカウントと各行に格納されたロックバイトはまだ更新されません(高速コミットの場合と同様に行はまだロックされています)。これにより、ブロックが変更されてもREDOは生成されません。
  4. 通常コミットされた(==高速コミットされた)ブロックは、次にタッチされたとき(および再実行されたときに)、遅延ブロッククリーンアウトが実行されます。
  5. コミットクリーンアウトが実行されたブロックは、次にタッチされたとき(およびやり直しを生成したとき)、遅延ロギングブロッククリーンアウトを受けます。

うまくいけば、誰かがこれらの点を確認できます!ありがとう!

12
BYS2

あなたには基本的な権利があります。コミットのタイプは1つだけです(normalfast..) 。)。

概念ドキュメント から:

トランザクションがコミットすると、次のアクションが発生します。

  • COMMITに対してシステム変更番号(SCN)が生成されます。

    トランザクションがコミットした、関連付けられているUNDOテーブルスペースレコードの内部トランザクションテーブル。トランザクションの対応する一意のSCNが割り当てられ、トランザクションテーブルに記録されます。 「シリアライズ可能な分離レベル」を参照してください。

  • ログ・ライター(LGWR)プロセスは、REDOログ・バッファー内の残りのREDOログ・エントリーをオンラインREDOログに書き込み、トランザクションSCNをオンラインREDOログに書き込みます。このアトミックイベントは、トランザクションのコミットを構成します。

  • Oracle Databaseは、行と表に保持されているロックを解放します。

    コミットされていないトランザクションによって保持されているロックを待機してエンキューされたユーザーは、作業を続行できます。

  • Oracle Databaseはセーブポイントを削除します。

  • Oracle Databaseはコミットのクリーンアウトを実行します。

    コミットされたトランザクションからのデータを含む変更されたブロックがまだSGAにあり、他のセッションがそれらを変更していない場合、データベースはブロックからロック関連のトランザクション情報を削除します。理想的には、COMMITがブロックをクリーンアップして、後続のSELECTがこのタスクを実行する必要がないようにします。

そのため、ブロックがまだSGAにある場合は、コミット中にクリーンアウト(やり直しで完全)が実行されます。

アクティブなシステムでは、コミットされていないトランザクションのあるブロックがディスクに書き込まれ、SGAからフラッシュされるのが一般的です。この場合、ブロックはそのまま残され、ブロックに触れる次のクエリは遅延ブロッククリーンアウトを実行します(ポイント5はすべてのケースで発生するわけではありません)。

6
Vincent Malgrat