Der einfachste Weg scheint zu sein, die Transaktionsisolationsstufe „serialisierbar“ zu verwenden, die Phantomlesevorgänge verhindert (andere Personen, die Daten einfügen, die ein vorheriges SELECT während Ihrer Transaktion erfüllen würden).
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);
Es gibt auch Techniken wie die „MERGE“-Anweisung von Oracle – eine einzelne Anweisung, die „einfügt oder aktualisiert“, je nachdem, ob die Daten vorhanden sind. Ich weiß nicht, ob Postgres ein Äquivalent hat, aber es gibt Techniken, um es zu "fälschen" - siehe z. Wie schreibt man INSERT IF NOT EXISTS-Abfragen in Standard-SQL .