ファントムリード

Webアプリ内で連番を振る処理を確認していて、「(トランザクション開始)データベースに格納されている数字を確認(select)して、その数字をふやす(update)(トランザクション終了)」という処理では、ファントムリードが起こる可能性があることに気がついてしまった。
というか、ファントムリード以外にも「同時に実行されることで同じ番号を二回読む可能性」がある気がしてきた。
ファントムリードは「シリアライザブル」にすれば回避できるが、「番号を二回読む」のは回避できない。PostgreSQLの自動連番が「たとえトランザクションロールバックしても元に戻らない」のはこの事態を回避する為なのだろうなぁ、と思った。
ACCESS EXCLUSIVEでロックする・・・のは大仰な気がするが、それしかないのか?明示的ロックなんて使いたくない代物だが。
もうちょっと調べると「select for update」の構文でもいいような気がしてきた*1・・・が、所詮これも明示的ロックなのか。
ロックをかけてしまうと致命的なエラーが発生しやすくなるはずで、精神衛生に悪いなぁ。

*1:タイミング的にはシビアにできるが、やっぱりこれでは駄目かも