いいえ、ドキュメントは正しくありません。トランザクションを単独で使用することはありません この問題を回避してください。例外が発生した場合にトランザクション全体がロールバックされることを保証するだけです。これにより、一貫性のない状態がデータベースに永続化されることはありません。
回避する この問題は、トランザクションの終了時にすべてのロックが解放されるため、トランザクション内でテーブルをロックする必要があります。次のようなもの:
BEGIN;
LOCK TABLE mytbl IN SHARE MODE;
-- do your find_or_create here
COMMIT;
しかし、それはすべての魔法の治療法ではありません。パフォーマンスの問題になる可能性があり、デッドロックが発生する可能性があります。 (他のリソースがすでにロックしているリソースを相互にロックしようとする並行トランザクション)。 PostgreSQLはそのような状態を検出し、競合するトランザクションの1つを除くすべてをキャンセルします。失敗したときに操作を再試行する準備をする必要があります。
並行性があまりない場合は、問題を無視することもできます。タイムスロットは非常に小さいため、実際に発生することはめったにありません。害を及ぼさない重複キー違反エラーを見つけた場合は、これもカバーしています。