Postgres のトランザクション分離レベルの SERIALIZABLE

id:unibon:20070921:p10 の続き。Postgres も Oracle と似たようなものらしい。
トランザクション分離レベルを SERIALIZABLE にしてから、あるトランザクション(A)であるレコードをリードして、別のトランザクション(B)で同じレコードを更新しようとすると、普通の感覚なら A のトランザクションが commit されるまで B が待たされると思う。SQL Server だったらそうだと思う。
しかし、Oracle や Postgres だと、A のトランザクションが rollback されてしまい、B が勝ち残る。なんちゅうしょぼい仕様だ。
Oracle や Postgres になぜ SELECT 〜 FOR UPDATE のような構文が用意されているのかと言えば、要は SERIALIZABLE がまともに機能しないからその代替として FOR UPDATE を使え、ということらしい。