見出し画像

トランザクションのACID特性

ACID特性とは

ACID特性とはトランザクションに定義されている特性の頭文字を取ったものです。
特性は4つあり、Atomicity (原子性)Consistency (一貫性)Isolation (独立性)Durability (永続性)のことです。

Atomicity (原子性)

トランザクションの中の全ての処理が実行されている状態になるか、実行されていない状態になる性質のことです。

例:りんごを100円で購入する場合を考えます。
成功する場合はりんごと100円を交換できた時です。
失敗する場合はりんごだけを受け取る時や、100円だけを払った時です。

Consistency (一貫性)

トランザクションの前後でデータの整合性が保たれて、データに矛盾の無い状態が保証される性質のことです。

例:りんごを100円で購入する場合を考えます。
成功する場合はりんごと100円を交換できた時です。
失敗する場合は1ドルを支払った時や、りんごとみかんを交換した時です。
※DBに購入金額は日本円であるという制約が事前にあるので、ドル単位で購入金額を保存すると1円という意味になってしまいます。

Isolation (独立性)

複数の処理が同時に発生したとしても、トランザクションが分離されて、他のトランザクションに影響を与えない性質のことです。

例: AさんとBさんがりんごを100円で購入する場合を考えます。

2人が同時に購入するイメージ図


成功する場合は、Aさんの買い物とBさんの買い物が分離されているので、お店には200円が保存されます。
Aさんの買い物でお店のりんごは1つ減り、お金は0 + 100 = 100で100円が残ります。
Bさんの買い物でお店のりんごは1つ減り、お金は100 + 100 = 200で200円が残ります。
失敗する場合は、Aさんの買い物とBさんの買い物が分離されておらず、お店には100円が保存されしまいます。
Aさんの買い物でお店のりんごは1つ減り、お金は0 + 100 = 100で100円が残ります。
Bさんの買い物でお店のりんごは1つ減り、お金は0 + 100 = 100で100円が残ります。
Aさんの処理結果にBさんの買い物結果を追加する必要があるのですが、両方とも初期状態に処理結果を追加しているため、最終的な結果に誤りが生じています。

Durability (永続性)

正常なトランザクションが完了したら、その結果は記録され、失われることがないという性質です。

例: Aさんがりんごを100円で購入する場合を考えます。
Aさんの買い物が終わった後で、お店で停電があってもAさんの買い物の結果は失われず記録されたままになっています。

まとめ

この記事ではトランザクションに定義されているACID特性について解説してきました。何気なく買い物をしている裏側で発生している処理を考えるのは好奇心が刺激されて良いですよね。例をなるべく身近にしようとしたせいで、正確さが犠牲になっています。正確でわかりやすい例を考えられるようになりたい。

この記事が気に入ったらサポートをしてみませんか?