Không, tài liệu không chính xác. Sử dụng một giao dịch đơn lẻ thì không tránh vấn đề này. Nó chỉ đảm bảo rằng toàn bộ giao dịch được khôi phục nếu một ngoại lệ xảy ra - để không có trạng thái không nhất quán nào được duy trì trong cơ sở dữ liệu.
Để tránh vấn đề này bạn phải khóa bảng - bên trong một giao dịch, bởi vì tất cả các khóa được giải phóng khi kết thúc một giao dịch. Một cái gì đó như:
BEGIN;
LOCK TABLE mytbl IN SHARE MODE;
-- do your find_or_create here
COMMIT;
Nhưng đó không phải là một phương pháp chữa bệnh kỳ diệu cho mọi thứ. Nó có thể trở thành một vấn đề về hiệu suất và có thể xảy ra bế tắc (các giao dịch đồng thời cố gắng khóa tài nguyên mà giao dịch kia đã khóa). PostgreSQL sẽ phát hiện một điều kiện như vậy và hủy bỏ tất cả ngoại trừ một trong các giao dịch cạnh tranh. Bạn phải chuẩn bị để thử lại thao tác khi không thành công.
Nếu bạn không có nhiều đồng thời, bạn cũng có thể bỏ qua vấn đề. Khoảng thời gian rất nhỏ nên nó chỉ rất hiếm khi thực sự xảy ra. Nếu bạn gặp lỗi vi phạm khóa trùng lặp, điều này sẽ không gây hại gì, thì bạn cũng đã bao gồm lỗi này.