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

データベースにおいて排他制御を行う理由は、二重更新を防ぐ為。
二重更新とは、同じレコードを複数のプログラムが同時に参照した後、異なるタイミングで更新をかけにいったときに起こる不具合。
具体的には、同じ銀行口座に対して複数の人が入金、出金を行ったような場合に二重更新が起こり、金額のつじつまがあわなくなる。
たとえば、残高に10万円あり、入金プログラムと出金プログラムがその値を読みこんだとする。
入金プログラムは、残高10万円に対し、入金されたお金(ここでは10万円とする)を足して20万円としてシステムに記録する。
その後、出金プログラムはあらかじめ読み込んだ残高10万円に対し、出金されたお金(ここでは1万円とする)を引いて、9万円としてシステムに記録する。
結果として、残高は9万円となってしまう。(本当は、残高10万円+入金10万円+出金1万円だから、残高19万円となる。)
これを防ぐために、最初に残高を読みこんだプログラムが更新が完了するまで、その口座の参照および更新を禁止すればよい。
これを排他制御という。


データベースにおいてトランザクションを行う理由は、複数のテーブルの整合性を保つ為。
普通預金から当座預金にお金が移動する場合、普通預金からお金を引いて、当座預金にお金を足すという流れになる。
たとえば、普通預金(残高10万円)から10万円を引いた段階で、システムエラーが発生し当座預金(残高0)にお金を足すのに失敗した場合、普通預金当座預金も残高0の状態となる!
システムエラーが発生した場合は、最初の状態、つまり普通預金に残高10万円、当座預金が残高0という状態に戻らなければならない。