データベースにおけるトランザクションとは、分けることのできない一連の処理単位のことを言う。
例として、銀行での振込処理の場合、A口座からB口座に振り込む時に以下の処理が必要となる。

  • A口座から残高を減らす
  • B口座の残高を増やす

上記のいずれかの処理中に、何らかの原因で一連の処理が中断してしまうと大問題だ。
そこで二つの処理をまとめてトランザクションとする。

トランザクションの排他制御

複数のトランザクションを同時に実行すると、同じデータを参照・更新してしまいデータの整合性が崩れる場合がある。
これを防ぐために排他制御を行い、一度に一つのトランザクションしかデータの更新を行えようロックをかける必要がある。

共有ロック・占有ロック

データを参照するだけなら、複数のトランザクションを同時に実行しても問題ない。
そのために共有ロックをかけ、データの参照は自由に行えるようにする。

また、データを更新する際には、別のトランザクションから参照できないように占有ロック(排他ロック)をかける。

デッドロック

二つのトランザクションで複数のデータを参照するとき、ロックをかけることで互いのデータが使用可能になるのを待ち続け、お互いがロック解除待ちの状態が続くことをデッドロックという。

ロールフォワードとロールバックによる障害回復処理

データベースは、デッドロックのようなトランザクション障害のほか、ハードウェア・ソフトウェアの障害などが起こる可能性がある。

このような障害に備えるため、データベース用のハードディスクとは別のディスクにログファイルを用意しておく必要がある。

ログファイルは、データを更新したらその都度更新する前のデータを記録する更新前ログ、また更新した後のデータを記録する更新後ログを用意しておく。

もしデータベース障害が起きてしまった時にトランザクションが完了していた場合は、更新後ログを使ってデータを復元させる。
この動作をロールフォワードという。

また、トランザクションのコミットが完了していないうちに障害が発生した場合は、トランザクション実行前のデータに戻す必要があるので更新前ログを用いてデータを復元させる。
この動作をロールバックという。