Det enklaste sättet verkar vara att använda transaktionsisoleringsnivån "serialiserbar", som förhindrar fantomläsningar (andra personer infogar data som skulle tillfredsställa ett tidigare SELECT under din transaktion).
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);
Det finns också tekniker som Oracles "MERGE"-sats - ett enda uttalande som "infogar eller uppdaterar", beroende på om data finns där. Jag vet inte om Postgres har en motsvarighet, men det finns tekniker för att "fejka det" -- se t.ex. Hur man skriver INSERT OM INTE FINNS-frågor i standard SQL .