【しりあらいざぶる】
Serializable とは?
最終更新:
💡 同時に処理しても、順番に実行した結果へ
並行して実行したトランザクションの結果を、ある順番で一つずつ実行した場合と同じにする分離レベルです。実際の処理をすべて一列に並べるとは限らず、競合時は再実行が必要になる場合があります。
📌 このページのポイント
Serializableだと、一人ずつしか処理できない?
どんな矛盾を防ぐの?
ほかの未確定の変更を読むダーティリードや、読み直すと値や該当行が変わる現象を防ぐよ。さらに、個々の読み取りだけでは分かりにくい、処理群の結果がどんな直列順序とも一致しない異常も防ぐ。単に同じ行の更新を避けることより広いんだ。
図の在庫の例では、どうなる?
最初の在庫が1個で、AとBがそれぞれ「在庫があれば1個減らす」を行うとしよう。Aの次にBなら、Aは購入でき、Bは在庫0を見て購入できない。その順番と同じ結果になる必要があるよ。Bが先の順番でもよく、どちらが先になるかまで指定するものではないんだ。
同時に動かして、あとで矛盾が分かったら?
PostgreSQLのSerializableでは、読み書きの依存関係を監視し、直列に説明できない組み合わせを検出すると、処理を失敗させる場合があるよ。アプリはトランザクション全体を最初から再実行できるようにする。最後のSQLだけをもう一度実行すればよいとは限らないんだ。
これを選べば、アプリの間違いもなくなる?
まとめ:ざっくりこれだけ覚えればOK!
「Serializable」って出てきたら「同時に処理しても、順番に実行したのと同じ結果にする分離レベル」と思えばだいたいOK!
📖 おまけ:英語の意味
「Serializable」 = 直列化可能
💬 serialは直列。実際に全部を一つずつ動かすという意味ではなく、成功した結果を直列の順序で説明できるということだよ。