Najprostszym sposobem wydaje się użycie poziomu izolacji transakcji „serializable”, który zapobiega fantomowym odczytom (inne osoby wstawiają dane, które spełniłyby poprzednią SELECT podczas transakcji).
if (!conn.getMetaData().supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)) {
// OK, you're hosed. Hope for your sake your drivers supports this isolation level
}
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Istnieją również techniki, takie jak instrukcja Oracle „MERGE” – pojedyncza instrukcja, która „wstawia lub aktualizuje” w zależności od tego, czy dane tam są. Nie wiem, czy Postgres ma odpowiednik, ale istnieją techniki „udawania” – patrz np. Jak napisać INSERT Zapytania IF NOT EXISTS w standardowym SQL .