Il modo più semplice sembrerebbe utilizzare il livello di isolamento della transazione 'serializzabile', che impedisce letture fantasma (altre persone che inseriscono dati che soddisferebbero una SELECT precedente durante la transazione).
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);
Esistono anche tecniche come l'istruzione "MERGE" di Oracle, una singola istruzione che "inserisce o aggiorna", a seconda che i dati siano presenti. Non so se Postgres abbia un equivalente, ma ci sono tecniche per "fingere" -- vedi ad es. Come scrivere INSERT IF NOT EXISTS query in SQL standard .