トランザクションの特性 / COMMITとROLLBACK / 排他制御


トランザクションの特性

トランザクションは、次の 4つの特性を満たさなければなりません。
これら 4つの特性は、それぞれの名前の頭文字をとって ACID 特性と言います。

  原子性 (ATOMICITY)

トランザクションは、それ以上分割することのできない最小の作業単位であるということです。
このため、トランザクションを構成する処理の結果がすべて有効になるか、またはすべて無効になるかのいずれかであるということになります。

例えば、あるトランザクションに処理 A と処理 B があるとします。

処理 A と処理 B が正しく実行されたときは両方の処理結果が有効になります。
しかし、処理 A だけ、または処理 B だけが正しく実行された場合は、両方の処理結果が無効になります。

一貫性 (CONSISTENCY)

トランザクションで処理されるデータは、実行前と後でデータの整合性を持ち、一貫したデータを確保しなければなりません。

隔離性 (ISOLATION)

処理対象が同じデータである複数のトランザクションを一度に実行する場合は、それぞれのトランザクションは隔離された (独立された) 状態でデータの変更を行わなければなりません。

トランザクション A とトランザクション B がデータを共有している場合、トランザクション A で変更中のデータを、トランザクション B で処理することは認められないということです。

トランザクション A が終了し、データが確定した後であればトランザクション B でデータを処理することができます。

持続性 (DURABILITY)

トランザクションで処理されるデータの状態はトランザクションが終了するまで変化しません。

トランザクションで処理を変更する SQL 文を実行しますが、トランザクションの最後で変更を確定するまでは実際のデータの変更は行われないということです。
これらのトランザクションの特性により、データベースへの同時アクセスを制御したり、障害発生時の処理を制御することができるようになります。

同時アクセスの制御では、会議室の予約システムを例に説明します。

総務部の AMI さんと人事部の YUMI さんがほぼ同時に同じ会議室を予約しようとしたときを想定します。
AMI さんも YUMI さんも自分のパソコンから会議室が開いていることを確認し(T1,T3)、それぞれが会議室を予 約しようとしてデータベースに書き込んでしまうと(T2,T4)、同じ会議室に対して2人が予約したことになってしまいます。
このような場合、データに不整合が発生してしまうことになります。

トランザクションはこのような問題に対して、その特性である CONSISTENCY (一貫性) と ISOLATION (隔離性) により対処することができます。

AMI さんのトランザクションは、会議室の状況を読み取った時点で開始され (T1)、予約情報を書き込んだ時点で終了します(T2)。
この間、YUMI さんが予約しようとしても (T4)、データはロックされるため、予約情報を書き込むことはできません。
その結果データの整合性が確保されます。

次に、障害発生時の処理の制御について、銀行の預金システムを考えてみましょう。

ある会社が本社の口座から営業所の口座に、資金を移動しようとする場合を想定します。
この場合に行う処理は、本社の口座の預金残高を減らすという処理と、営業所の口座の預金残高を増やすという処理を連続的に実行することです。

ところが、本社の預金残高を減らす処理に成功した後で (T1)、なんらかの障害が発生し (T2)、営業所の預金  残高を増やす処理に失敗すると (T3)、資金がなくなってしまうことになります。

トランザクションはこの問題に対して、ATOMICITY (原子性) と DURABILITY (持続性) の特性により対処できます。

トランザクションが正常に終了した場合にのみデータベースに変更を反映し、途中で何らかの障害が発生した場合には反映しないようにすることによって、データの整合性を確保します。

本社の預金残高を減らす処理と営業所の預金残高を増やす処理を一つのトランザクションにまとめます。
そして、トランザクション全体が正常に終了した場合にのみ、変更処理の結果を口座データに反映するようにします。

トランザクションは、本社の預金残高を減らした時点で開始され (T1)、営業所の預金残高を増やした時点で終了します (T3)。
この間、なんらかの障害が発生し (T2)、営業所の預金残高を増やす処理に失敗した場合には、トランザクション全体が取り消されるため、本社の口座データに対する変更処理も反映されません。

その結果、データの整合性が確保されます。

COMMITとROLLBACK

トランザクションによるデータの変更処理が正常に終了した場合に、その変更処理を有効な結果と確定し、データベースに反映することをコミットと言います。

また、トランザクションによるデータの変更処理の途中で何らかの障害が発生した場合に、それまでの変更処理を無効なものとし、トランザクションが実行される前の状態にもどすことをロールバックと言います。

このコミットとロールバックによりトランザクションの ACID 特性が生きているといえます。

排他制御

排他制御とは、あるトランザクションが実行中のときに、そのトランザクションが対象としているデータをロックし、他のトランザクションのアクセスを禁止することによって、データの整合性を確保しようとする仕組みです。

トランザクションが完了すれば、ロックは解除され、他のトランザクションはデータにアクセスできるようになります。

例えば、あるお店の在庫管理テーブルに商品が 30個登録してあるとします。

販売員 P さんが商品 A を 15個  販売し、ほぼ同じ頃に販売員 Q さんが商品 A を 5個販売しました。
このとき、二人の販売員が在庫管理テーブルのデータを更新しようと次のような処理を行ったとします。

販売員 P さんは在庫テーブルから商品 A の個数を 15個マイナスし、販売員 Q さんは 5個マイナスする。
このとき排他制御がない場合、販売員 P さんも販売員 Q さんも同じ在庫数 30個を読み取り、それぞれで処理を行います。
その結果、商品 A の在庫数は 25個となり、販売員 P さんの処理は結果に反映されなくなり 、データに不整合が生じます。

排他制御が行われている場合は、販売員 P さんがトランザクションを開始したときにデータはロックされ、販売員 Q さんはトランザクションを実行することができません。

販売員 P さんが在庫数を 30個から 15個に更新し、トランザクションが終了した後に、販売員 Q さんは在庫数を 15個から 10個に更新することができるようになります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 7 = 2

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>