A maneira mais simples parece ser usar o nível de isolamento de transação 'serializável', que impede leituras fantasmas (outras pessoas inserindo dados que satisfariam um SELECT anterior durante sua transação).
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);
Existem também técnicas como a instrução "MERGE" da Oracle - uma única instrução que faz 'inserir ou atualizar', dependendo se os dados estão lá. Não sei se o Postgres tem um equivalente, mas existem técnicas para 'fingir' - veja, por exemplo, Como escrever INSERT IF NOT EXISTS consultas no SQL padrão .