今回は、Undo ログと Redo ログをクリアする必要があります

トランザクションとACID

データベースについて学ぶとき、トランザクションと ACID という用語をよく目にします。

トランザクションとは何ですか?

データベース システムでは、トランザクションとは、一連のデータベース操作で構成される完全な論理プロセスを指します。

たとえば、銀行振込の場合:
1. 元の口座から金額を差し引き、
2. 対象口座に金額を追加します。

これら 2 つのデータベース操作を合計すると、分割できない完全な論理プロセスが構成されます。このプロセスはトランザクションと呼ばれ、ACID プロパティを持ちます。

では、ACIDとは何でしょうか?

Wikipedia での ACID の定義は次のとおりです。

ACID は、データの書き込みまたは更新のプロセス中にトランザクションが正確で信頼性があることを保証するためにデータベース管理システム (DBMS) が持つ必要がある 4 つの特性を指します。原子性 (または不可分性)、一貫性 (一貫性)、分離性 (分離、独立性とも呼ばれます)、永続性(耐久性)。

  • アトミック: 同じビジネス プロセス内で、トランザクションは複数のデータ変更が同時に成功するか、一緒に取り消されることを保証します。たとえば、転送の場合、転送が成功するか失敗するかのどちらかであり、転送の半分などというものはありません。
  • 分離: さまざまなビジネス プロセスにおいて、トランザクションにより、各ビジネスによって読み書きされるデータが互いに独立しており、相互に影響を及ぼさないことが保証されます。データベースには通常、Read Uncommitted、Read Committed、Repeatable Read、Serializable の 4 つの分離レベルがあります。
  • 耐久性: トランザクションは、正常に送信されたすべてのデータ変更が正しく永続化できること、つまり、データを失うことなくディスクに保存できることを保証する必要があります。
  • 一貫性: システム内のデータが正しいこと、異なるデータ間に矛盾がないこと、結果が一貫していることを確認します。

実際、原子性、分離、永続性の最終的な目標は、データの一貫性です。

原子性と永続性を実現する方法

アトミック性により、トランザクション内の複数の操作が成功または失敗することが保証され、半分の成功は存在しません。永続化により、トランザクションが有効になると、いかなる理由でもデータが変更されたり失われたりすることがなくなります。

では、原子性と永続性が達成できたらどうなるでしょうか?

それは簡単に考えられますが、データベースがデータをディスクに書き込むだけで十分ではないでしょうか?

はい、これは正しい方法ですが、問題は、「ディスクへの書き込み」操作がアトミックではなく、書き込み操作のステータスが書き込み、書き込み、書き込み成功、さらには書き込み失敗の可能性があることです。

また、トランザクションには複数の操作が含まれることがよくあります。たとえば、オンラインで注文する場合、通常、アカウントからの引き落とし、販売者のアカウントへの追加、商品の在庫の減算などの操作が含まれます。これらの操作はトランザクション内にあります。つまり、すべてが成功するか、すべてが失敗します。

クラッシュリカバリー

私たちの口座から 100 元が引き落とされた場合、この操作はディスクに正常に書き込まれますが、販売者に 100 元を追加すると、システムがクラッシュするか (とても運が悪い?)、停電が発生します (そうではないでしょうか?)。 、結果として Login failed と書かれてしまいます(よくあることではないでしょうか?)。

このような事態を避けるために、データベースは、システムがクラッシュする前に完全な操作がどのようなものであったかを知る方法を見つける必要があります。そのため、サーバーが回復した後、データベースは時間のなかったデータの部分を書き換える必要があります。をディスクに書き込み、販売者にアカウントに 100 元を追加して、未完了の作業を完了します。

そこで問題は、システムが復元された後、データベースはどのようにして以前のトランザクションに関するすべての情報を知ることができるのかということです。

良い記憶力は悪いペンほど良くはありません。まずそれを書き留めてみませんか?

やり直しログ

これには、データベースに、どのデータが変更されるか、データが物理的にどのメモリ ページとディスク ブロックに配置されるか、どの値がどの値に変更されるかなど、ディスクに書き込む前にトランザクションのすべての操作を記録する必要があります。フォームは最初にディスクに書き込まれます。

すべてのログ レコードをディスクに安全に配置し、最後に「コミット レコード」を書き込んで初めて、すべての操作レコードの書き込みが完了したことになります。

このとき、データベースはログの情報に従って実際のデータを変更します。変更が完了すると、ログ内のすべての手順が完了したことを示す「終了レコード」がログに追加されます。トランザクション永続化の作業 以上です。

このトランザクションの実装方法を「コミットロギング」と呼びます。

データの永続性とアトミック性を実現するこの方法の原理は次のとおりです。

まず、ログがコミット レコードに正常に書き込まれると、トランザクションに関連するすべての情報がログに書き込まれたことになります。データ変更のプロセス中にシステムがクラッシュした場合は、再起動後、必要に応じて再操作するだけです。ログの内容に変換され、永続性が保証されます。

次に、ログが終了する前にシステムがクラッシュした場合、システムの再起動後、データベースはログにコミット レコードがないことを確認します。これは、ログが不完全で書き込まれていないことを意味し、ログのこの部分にマークを付けます。ロールバック状態では、トランザクション全体がロールバックされ、アトミック性が保証されます。

つまり、変更したい内容をログに記録し、そのログに従ってディスクに書き込むのですが、ディスクへの書き込み中に気を失ってしまった場合、目が覚めたときにチェックを入れます。まずログの整合性を確認します。

ログが完全で、その中にコミット レコードがあれば、ログに従ってもう一度実行し、最終的には成功します。ログが不完全で、そこにコミット レコードがない場合は、トランザクション全体をロールバックするだけで何もしません。

このログをRedo Log、つまり「やり直しログ」と呼び、データベースが途中でクラッシュした場合、このログを基にトランザクションをやり直します。

アンドゥログ

ただし、Redo Log には効率が遅すぎるという問題があります。

データベースによるデータへの実際の変更はすべて、トランザクションがコミットされた後、ログがコミット レコードに書き込まれた後にのみ行われる必要があるためです。

トランザクションがコミットされる前にディスク I/O が十分に空いている場合でも、特定のトランザクションによって変更されたデータの量が非常に多く、大量のメモリ バッファを占有している場合でも、理由が何であれ、それは決して許可されません。トランザクションがコミットされる前にディスク上のデータの変更を開始します。システムがクラッシュした場合、データ トリップの責任は誰にありますか?

ただし、トランザクション内のデータ量が特に大きい場合は、すべての変更が REDO ログに書き込まれるのを待ってから、それらを均一にディスクに書き込むため、パフォーマンスはあまり良くなく、非常に遅くなります。上司は不幸になるでしょう。

トランザクションがコミットされる前に、こっそりと (こっそりと) ディスクにデータを書き込むことはできますか?

答えは「はい、これは STEAL 戦略です。しかし、ここで問題が発生します。トランザクションをロールバックする必要がある場合やシステムがクラッシュした場合に備えて、データを秘密裏に書き込むと、事前に書き込まれたデータがダーティ データになり、方法を見つけなければなりません。復元するだけです。

これには、アンドゥ ログ (ロールバック ログ) の導入が必要です。データを秘密裏に書き込む前に、まず、どのデータが書き込まれ、何が変更されたかをアンドゥ ログに記録する必要があります。トランザクションがロールバックされたら、アンドゥ ログ ログに従います。まるで何も変更されていないかのように、元の外観に戻りました。

アンドゥ ログには、複数行バージョン管理 (MVCC) を実装する機能もあります。読み取られた行が他のトランザクションによってロックされている場合、アンドゥ ログから行レコードの前のデータを取得し、行のバージョン情報を提供します。ユーザーが読むためのものです。

要約する

Undo Log (redo ログ) と Redo Log (rollback log) の違いはそれほど深いものではなく、文字通りに理解する必要があります。

Redo Log (やり直しログ) は、システムクラッシュ後にデータを復元するために使用され、データベースがログに従ってうまく実行されなかったことをやり直すことができます。REDO ログを使用すると、データベースがクラッシュして再起動した場合でも、以前に送信されたレコードが失われないことを保証できます。この機能はクラッシュ セーフと呼ばれます。

アンドゥログ(ロールバックログ)はロールバック用です。トランザクションがコミットされる前にデータの書き込みを開始します。トランザクションが最後にコミットされる予定がなくロールバックする必要がある場合、またはシステムがクラッシュした場合、事前に書き込まれたデータはダーティ データになります。このとき、Undo Logを復元するには使用する必要があります。

ディスクに書き込む前にログを書き込むこの方法は、先行書き込みログ (WAL) と呼ばれます。WAL はパフォーマンスを向上させますが、同時により複雑になります。より複雑ではありますが、効果は非常に優れています。 Mysql、sqlite、Postgresql、SQL Server、およびその他のデータベースには WAL メカニズムが実装されています。

おすすめ

転載: blog.csdn.net/zhanyd/article/details/122582031