🙆

[超初心者向け!] トランザクションのロギングを図でわかりやすく解説[ロギングその①]

に公開

はじめに

トランザクションのロギングを初心者向けに図でわかりやすく解説してみました。
参考にしていただければ幸いです。

この記事の対象者

・トランザクション初心者

目次

  1. なぜログが必要なのか
  2. ロギングの仕組み: WAL (write-ahead logging)

1. なぜログが必要なのか

トランザクションには「ACID特性」という守るべきルールがあります。

原始性(Atomicity)

トランザクションはコミット or アボートのどちらかでないといけない性質です。
⇒途中でアボートしてしまったとき、既にデータベースに書いてしまった分を元に戻すためにログが必要になります。

永続性(Durability)

トランザクションがコミットしたら、そのデータは絶対に消えない(永続する)という性質です。
⇒不揮発性メモリに書き込むまでの間に揮発性メモリの電源が切れた場合、データがなくなるためログが必要になります。

2. ロギングの仕組み: WAL (write-ahead logging)

WALは、データ本体を書き換える前にまずログを書く仕組みのことをいいます。

T0: r(A) w(A) r(B) w(B) commit
を例とし、2PLのロギングを解説します。

即時法

即時法(e.g. 2PL)では、トランザクションの途中でデータ本体がディスクに書き戻される可能性があります。そのため、データ本体を書き換える前に、対応するログが必ずディスクに永続化されている必要があります(WAL)。

  1. メモリにトランザクションを開始したログを書きます
  2. メモリ上で更新: データをメモリの上で書き換えます。
  3. ログをディスクへ: 「Aを1000から950に変えた」というログをメモリ上に書き込みます。このログは、後でデータ本体をディスクへ書き戻す必要が生じた場合に備えて、先にディスクへフラッシュされます。即時法では、未コミットな変更がディスクに出る可能性があるため、Undo できる情報を必ず先に残します。

  4. Bも同様に行います

  5. 本体の更新: ディスク上のデータ本体の書き換えは、対応するログがすでにディスクにある範囲で、バッファに空きが必要になったときなどに行われます。このように、ログがあればデータ本体の更新は急ぐ必要がありません。
  6. メモリ上のログにコミットが記録されると、そのログをディスクにフラッシュします。(この時点でこのトランザクションはコミットします)

遅延法

遅延法(e.g.OCC)では、コミットした場合、ログをフラッシュします。

  1. メモリ上で更新: データをメモリの上で書き換えます。
  2. ログをディスクへ: 「Aを1000から950に変えた」というログをメモリ上に書き込みます。
  3. トランザクション内のすべての処理を終わらせます。
  4. メモリ上のログにコミットが記録されると、そのログをディスクにフラッシュします。(この時点でこのトランザクションはコミットします)遅延法では、途中の書き込みではディスクを触りません。
    コミットの瞬間にまとめてログを書き出すため、ディスクへの同期回数が減り、全体のスループットが向上します。
  5. 本体の更新: ディスク上のデータ本体の書き換えは、対応するログがディスクにある範囲で手が空いた時に行います。

最後まで読んでくださりありがとうございました!
ぜひ、続編も読んでください↓
https://zenn.dev/risaaa/articles/54f8a090f63816

Discussion