【しりあらいざぶる】

Serializable とは?

💡 一人ずつ順番にどうぞ!割り込み禁止の最強ガード
📌 このページのポイント
Serializable(直列化可能) 並列実行(競合あり) TX-A: 読取→更新 TX-B: 読取→更新 → 結果が矛盾する可能性 Serializable(順番実行) TX-A: 完了 TX-B: 待機→実行 → 常に正しい結果 トレードオフ 安全性: 最高 速度: 低下 デッドロック注意
Serializableのイメージ
ひよこ ひよこ

Serializableって最強の分離レベルなんだよね?

ペンギン先生 ペンギン先生

そう!すべてのトランザクションが「一つずつ順番に実行された」のと同じ結果になることを保証するレベルだよ。ダーティリードノンリピータブルリードファントムリードも全部防げるんだ

ひよこ ひよこ

じゃあ全部Serializableにすればいいんじゃないかな?

ペンギン先生 ペンギン先生

理想はそうだけど、実際にはパフォーマンスが大幅に低下するんだよ。同時に処理できるトランザクション数が減るから、大量のアクセスがあるシステムでは応答が遅くなってしまうんだ

ひよこ ひよこ

どういう仕組みで順番を保証してるの?

ペンギン先生 ペンギン先生

データベースによって異なるけど、主に2つの方式があるよ。ロックベースでは実際にデータをロックして他のトランザクションを待たせる方式。PostgreSQLのSSI(Serializable Snapshot Isolation)では、楽観的に処理して矛盾を検出したらロールバックする方式を使ってるんだ

ひよこ ひよこ

どんなときに使うべきなの?

ペンギン先生 ペンギン先生

お金の移動や在庫の引き当てなど、絶対に矛盾が許されない処理だね。でも実務では、アプリケーション側でロジックを工夫して、Repeatable ReadやRead Committedで安全に処理することが多いよ

ひよこ ひよこ

アプリ側で工夫するってどういうこと?

ペンギン先生 ペンギン先生

たとえばSELECT ... FOR UPDATEで明示的にロックを取ったり、楽観的ロックでバージョン番号をチェックしたりする方法だよ。分離レベルだけに頼らず、必要な箇所だけピンポイントで保護する方が実用的なんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Serializable」って出てきたら「全トランザクションを順番に実行する最強の整合性保証」と思えればだいたいOK!
📖 おまけ:英語の意味
「Serializable」 = 直列化可能
💬 serial(直列)にできる(-izable)という意味で、並列処理でも直列に実行したのと同じ結果になることを保証するんだよ
← 用語集にもどる