DBにはトランザクションがあります。
トランザクションとはまとまった一連の処理のことです。
トランザクションにはACID特性と呼ばれる、特性があります。ACID特性を理解するとDBの扱いが上手くなります。
大規模なサービスや複雑な処理をしたい時に役に立ちます!
ACID特性とは
ACID特性とはトランザクションに定義されている特性の頭文字を取ったものです。
特性は4つあります。
- 原子性(Atomicity)
- 一貫性(Consistency)
- 独立性(Isolation)
- 永続性(Durability)
ちょっと、言葉が固いですね…
それぞれの特性を説明していきますね!
原子性(Atomicity)
原子性とはトランザクションの中の全ての処理が実行されている状態になるか、実行されていない状態になる特性です。
処理とデータベースに保存される値を確認しながら、理解すると分かりやすいです!
くまなつがお店でりんごを100円で購入する場合を考えます。
- くまなつはお店からりんごを1つ受け取ります
- くまなつはお店に100円を払います
トランザクションが成功する場合
くまなつはりんごが1つ増えて、100円減ります。お店はりんごが1つ減り、100円増えます。
トランザクションが失敗する場合
くまなつとお店ともにりんごの数量も残金も変わらないです。
一貫性(Consistency)
一貫性とはトランザクションの前後でデータの整合性が保たれて、データに矛盾のない状態が保証される特性のことです。
くまなつがお店でりんごを100円で購入する場合を考えます。原子性の時とトランザクションは同じになります。
- くまなつはお店からりんごを1つ受け取ります
- くまなつはお店に100円を払います
データベースにはりんごの数量が0の時は購入できない。支払いは日本円でするなどの制約があります。
トランザクションが成功する場合
くまなつの残金が100円、お店にりんごが1つ以上ある時です。
くまなつはりんごが1つ増えて、100円減ります。お店はりんごが1つ減り、100円増えます。
トランザクションが失敗する場合
くまなつの残金が100円より少ない、お店にりんごが1つもない時です。
くまなつとお店ともにりんごの数量も残金も変わらないです。
独立性(Isolation)
独立性とは複数の処理が同時に発生したとしても、トランザクションが分離されて、他のトランザクションに影響を与えない特性のことです。
複数のトランザクションがあると、古いデータを取得したり、削除済みのデータを更新したりすることがあります。これを防ぐのが独立性です。
くまなつとうさぎがお店でりんごを100円で購入する場合を考えます。
- くまなつはお店からりんごを1つ受け取ります
- くまなつはお店に100円を払います
- うさぎはお店からりんごを1つ受け取ります
- うさぎはお店に100円を払います
トランザクションが成功する場合
くまなつの残金が100円、うさぎの残金が100円、お店にりんごが2つ以上ある時です。
くまなつはりんごが1つ増えて、100円減ります。お店はりんごが1つ減り、100円増えます。
うさぎはりんごが1つ増えて、100円減ります。お店はりんごが1つ減り、100円増えます。
トランザクションが失敗する場合
くまなつの残金が100円、うさぎの残金が100円、お店にりんごが1つだけある時です。
くまなつのトランザクションが終わる前に、うさぎのトランザクションが開始するとお店にりんごが1つしかなくてもトランザクションが開始してしまいます。
永続性(Durability)
永続性とは正常なトランザクションが完了したら、その実行結果は記録され失われることがないという特性です。
この特性が一番わかりやすいですね!
せっかく取引したのにデータが消えてしまうと悲しいですよね。
なので、トランザクションが成功するとそれがずっと残り続けます。