トランザクションとは
トランザクションとは、一つにまとまっている処理でそのまとまりは分割が出来ない処理のことです。処理自体は複数のものが合わさったものですが、一つ一つに分けてしまうと何かあったときに整合性が取れなくなってしまう処理です。
お店の商品の販売を例にとって書いていきます。
ある商店が商品αを1つお客さんに売りました。この商品の売り上げが100円だったとします。この時に商品αの在庫が1つ減り、売り上げが100円計上されます。
この在庫の減少と売り上げの計上が同時に行われないとデータの整合性が取れません。在庫の減少がないと売り上げだけ100円計上され「商品αが売れたはずなのに在庫が減ってない」となります。逆に売り上げがないと「商品αがなぜか無くなっている」ということになってしまいます。
そうなってしまっては何のためにシステムで在庫と売り上げの管理をしているかわからなくなってしまいます。
そうならないためにも在庫の減少と売り上げの計上を一緒の処理としておきます。この一緒になった分割できない処理がトランザクションなのです。
コミットとは
コミットとはトランザクションの一連の処理がすべて成功して終了したらその処理を確定させることです。システムではいつどこで何が起きて処理が失敗するかわかりません。
そのため、すべてが成功して終わるまでは暫定的な内容でDBに登録している状態です。すべてが成功して終わってからその内容を恒久的なものであると確定させるのがコミットです。
例でいうと、在庫の減少の処理と売り上げの計上の処理が両方とも成功したときにコミットが行われます。
ロールバックとは
ロールバックとはトランザクションの一連の処理のどこかで失敗があったときにすべてを元に戻し処理前の状態に戻すことです。
例でいうと在庫の減少をさせた後に売り上げの処理で失敗した場合、在庫の減少だけさせておくわけにはいきません。なぜなら謎の在庫減少として後々データが残ってしまうからです。
そのため、売り上げの処理で失敗したときに売り上げの処理をもとに戻すのはもちろんのこと、処理が成功していた在庫の減少を取り消して元の在庫に戻すということが必要なためもとに戻すということがロールバックです。
失敗があったときのことがあるため、トランザクションでは暫定的な状態にして、失敗したときにロールバックし、すべてが成功して終了したときにはじめてコミットするという流れになっているのです。