【しりあらいざぶる】
Serializable とは?
💡 一人ずつ順番にどうぞ!割り込み禁止の最強ガード
📌 このページのポイント
- トランザクション分離レベルの中で最も厳格なレベル
- すべての読み取り異常(ダーティリード、ノンリピータブルリード、ファントムリード)を防止
- ロックやMVCCにより同時実行性が低下し、パフォーマンスへの影響が大きい
- 金融取引や在庫管理など、絶対的な整合性が求められる場面で使用
Serializableって最強の分離レベルなんだよね?
そう!すべてのトランザクションが「一つずつ順番に実行された」のと同じ結果になることを保証するレベルだよ。ダーティリードもノンリピータブルリードもファントムリードも全部防げるんだ
じゃあ全部Serializableにすればいいんじゃないかな?
理想はそうだけど、実際にはパフォーマンスが大幅に低下するんだよ。同時に処理できるトランザクション数が減るから、大量のアクセスがあるシステムでは応答が遅くなってしまうんだ
どういう仕組みで順番を保証してるの?
データベースによって異なるけど、主に2つの方式があるよ。ロックベースでは実際にデータをロックして他のトランザクションを待たせる方式。PostgreSQLのSSI(Serializable Snapshot Isolation)では、楽観的に処理して矛盾を検出したらロールバックする方式を使ってるんだ
どんなときに使うべきなの?
お金の移動や在庫の引き当てなど、絶対に矛盾が許されない処理だね。でも実務では、アプリケーション側でロジックを工夫して、Repeatable ReadやRead Committedで安全に処理することが多いよ
アプリ側で工夫するってどういうこと?
たとえばSELECT ... FOR UPDATEで明示的にロックを取ったり、楽観的ロックでバージョン番号をチェックしたりする方法だよ。分離レベルだけに頼らず、必要な箇所だけピンポイントで保護する方が実用的なんだ
まとめ:ざっくりこれだけ覚えればOK!
「Serializable」って出てきたら「全トランザクションを順番に実行する最強の整合性保証」と思えればだいたいOK!
📖 おまけ:英語の意味
「Serializable」 = 直列化可能
💬 serial(直列)にできる(-izable)という意味で、並列処理でも直列に実行したのと同じ結果になることを保証するんだよ