トランザクションとは
トランザクションの概要
データベースへの更新処理などはINSERT文やUPDATE文によって行う。
これらの処理は単一である。しかし実際の作業単位として複数のINSERTやUPDATEを一つの作業としたい場合がある。
単一の処理を複数個まとめたものをトランザクションという。
トランザクションでは全ての作業が完了した場合のみデータベースに適用を行い、トランザクション内の処理が一つでも完了しなかった場合は全ての作業をデータベースに適用しない。
トランザクションの例
トランザクションが必要な簡単な例としては銀行の入出金システムがある。
銀行の業務でA氏の口座からB氏の口座にお金10万円を移動させる場合を考えます。
このとき以下の2つのステップを実行する必要があります。
- A氏の口座から10万円を引く
- B氏の口座に10万円足す
この処理をトランザクションを利用せずに実行し、処理2で失敗した場合A氏の口座から10万円引かれたがB氏の口座に10万円足されないといった問題が発生してしまいます。
ここでトランザクションを利用していた場合は、処理2で失敗した場合でも処理1をロールバックし元の状態にもどします。
しかし処理2を実行中にデータベース自体がクラッシュしてしまった場合はどうなるでしょうか。この場合A氏は10万円を失うかもしれません。
そようなことがないよにトランザクション処理にはACIDという4つの要素が必要と言われています。
ACIDとは
Atomicity(アトミック性)・Consistency(一貫性)・Isolation(分離性)・Durability(永続性)のそれぞれの頭文字をとりACIDと言います。
Atomicityアトミック性)
これはトランザクション全体が分割できない作業の単位として機能し、部分的に完了することがないということを指しています。
Consistency(一貫性)
1つの一貫した状態状態から次の一貫した状態へ移行するべきであることを指す。先ほどの例で処理2でデータベース自体がクラッシュしたとしても処理1はデータベースに適用されることはないということである。
Isolation(分離性)
トランザクションの結果はトランザクションが完了するまで他のトランザクションからは見ることができない。つまりは途中経過などをみることができないということを指している。
Durability(永続性)
トランザクションが完了したあとにデータベースがクラッシュしたとしても完了した結果は失われないこと指している。
これらのACIDを満たすことが一貫性を保証するためには不可欠であるとされている。
最後に
AICDトランザクションは一貫性を保つためには不可欠な機能であるが、ACID機能を持たないデータベースと比べた場合多くのCPUパワー・メモリ・ディスク領域を必要とする。そのためACIDトランザクションが必要でない場合は対応しないストレージエンジンを用いることでパフォーマンスを改善できるかもしれない。
ただし一貫性を求める場合は基本的にACIDトランザクションを用いるべきだと思う。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
この記事はほぼサーバなどを触ったことがない人物が学んだことを整理するために書いていますので間違いなどが多々あると思います。間違いなどありましたら是非コメントなどで教えていただけると幸いです。