Nej, dokumentationen er forkert. Brug af en transaktion alene ikke undgå dette problem. Det garanterer kun, at hele transaktionen rulles tilbage, hvis der skulle opstå en undtagelse - så ingen inkonsekvent tilstand vil blive ved med at være i databasen.
At undgå dette problem skal du låse bordet - inde i en transaktion, fordi alle låse frigives i slutningen af en transaktion. Noget som:
BEGIN;
LOCK TABLE mytbl IN SHARE MODE;
-- do your find_or_create here
COMMIT;
Men det er ikke en magisk kur mod alt. Det kan blive et præstationsproblem, og der kan være deadlocks (samtidige transaktioner, der gensidigt forsøger at låse ressourcer, som den anden allerede har låst). PostgreSQL vil opdage en sådan tilstand og annullere alle de konkurrerende transaktioner undtagen én. Du skal være forberedt på at prøve handlingen igen ved fejl.
Hvis du ikke har en masse samtidighed, kan du også bare ignorere problemet. Tidsrummet er meget lille, så det sker kun meget sjældent. Hvis du fanger fejlen med dubletnøglebrud, som ikke vil skade, så har du også dækket dette.