Tidak, dokumentasinya salah. Menggunakan transaksi saja tidak menghindari masalah ini. Ini hanya menjamin bahwa seluruh transaksi dibatalkan jika pengecualian harus terjadi - sehingga tidak ada status yang tidak konsisten yang dipertahankan ke database.
Untuk menghindari masalah ini Anda harus mengunci meja - di dalam transaksi, karena semua kunci dilepaskan pada akhir transaksi. Sesuatu seperti:
BEGIN;
LOCK TABLE mytbl IN SHARE MODE;
-- do your find_or_create here
COMMIT;
Tapi itu bukan obat ajaib untuk semuanya. Ini bisa menjadi masalah kinerja, dan mungkin ada kebuntuan (transaksi bersamaan yang saling mencoba mengunci sumber daya yang sudah dikunci oleh yang lain). PostgreSQL akan mendeteksi kondisi seperti itu dan membatalkan semua kecuali satu transaksi yang bersaing. Anda harus siap untuk mencoba kembali operasi jika gagal.
Panduan PostgreSQL tentang kunci.
Jika Anda tidak memiliki banyak konkurensi, Anda mungkin juga mengabaikan masalahnya. Slot waktu sangat kecil sehingga sangat jarang benar-benar terjadi. Jika Anda menemukan kesalahan pelanggaran kunci duplikat, yang tidak akan membahayakan, maka Anda juga telah mengatasinya.