はじめに
どうもー上司に「ACID特性って知ってるか?」と言われ、「すみません、良く分からません」とSiriみたいに答えてしまった株式会社YUZURIHAのキムです。
過去の自分を反省し、調べて理解したことをまとめてみました。
ACID特性とは
ACID(原子性、一貫性、独立性、永続性)はトランザクション処理の信頼性を保証するために求められる性質であるとする考え方である。
まずは、A(Atomicity)
日本語では原子性。。日本にきて8年も経ってますが、聞きなれない言葉ですね。
トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行されないことを保証する性質です。
例えば、お友達にお金を送ったのに、お友達には届いてなかったら困りますよね。
// お友達にお金を送る
\DB::beginTransaction();
try {
// お金をお友達に送金
transferMoney($myId, $friendId);
// 自分の口座からお金が減る
recalculationAccount($myId);
// お友達の口座にお金が増える
recalculationAccount($friendId);
// 全てのタスクが実行されたらデータベースに反映される
\DB::commit();
}catch (\Exception $e) {
// 例外発生時は巻き戻し、データベースに反映されない
// エラー内容表示
\DB::rollback();
// ログを残す
\Log::error($e);
}
上記のようにトランザクション内に複数のタスクがあって、全て実行された場合のみCOMMIT;
一つでも実行されなかったらROLLBACK;
このように全て行われるか、あるいは全く行われないことを指します。
お次は、C(Consistency)
日本語では一貫性あるいは整合性とも呼ばれる。
トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質です。
例えば、主キーである口座番号が二つ存在したり、残高よりも高い買い物ができたり、処理中にデータベース内のデータに矛盾がないことを常に保証してくれていることを指します。
あと少し、I(Isolation)
日本語では分離性、独立性または隔離性ともいう。
全てのトランザクションは他のトランザクションから分離、独立することを保証する性質です。
複数のトランザクションが同時に実行されても、結果は変わらないことを指します。
例えば、下記では実行中のトランザクション以外は、送金前と送金後のいずれかの状態しか観測できません。
時点 | 自分の口座 | お友達の口座 |
---|---|---|
送金前 | 10万円 | 20万円 |
実行中 | 9万円 | 20万円 |
送金後 | 9万円 | 21万円 |
ただし、トランザクションには分離レベルがございまして、内容をまとめてみました。
Isolation level
一般的なDBMSはRead Commitedを使用
MySQLはRepeatable Readを使用
分離レベル | Dirty Read | Non-Repeatable Read | Phantom Read | |
---|---|---|---|---|
0 | Read Uncommitted | 〇 | 〇 | 〇 |
1 | Read Commited | X | 〇 | 〇 |
2 | Repeatable Read | X | X | 〇 |
3 | Serializeable | X | X | X |
Dirty Read
- トランザクション実行中に更新したまだCOMMITされてないデータを他のトランザクションから読み取ることができる
Non-Repeatable Read
- トランザクション内で同じデータを2回読み取った時、値が異なる
- トランザクション実行中にレコードの更新、削除ができるため起こる現象
Phantom Read
- トランザクション内で同じデータを2回読み取った時、最初のクエリにはなかったレコードが現れる
- トランザクション実行中にレコードの追加ができるため起こる現象
ラスト、D(Durability)
日本語では永続性あるいは持続性と呼ばれる。
トランザクション操作の完了通知をユーザが受けた時点で、その操作は永続的となり、結果が失われないことを指す。
何らかの被害が発生しても、ログやバックアップなどで正常に終わった時点に復旧できる手段があることを指します。
人的ミスなどどうしようもない被害もあります。
さいごに
「〇〇って知ってるか?」恐るべし
下記のサイトを参考させていただきました。
https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6)