最も簡単な方法は、トランザクション分離レベル「シリアライズ可能」を使用することです。これにより、ファントム読み取り(トランザクション中に以前のSELECTを満たすデータを挿入する他の人)が防止されます。
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);
Oracleの「MERGE」ステートメントのような手法もあります。これは、データが存在するかどうかに応じて、「挿入または更新」を行う単一のステートメントです。 Postgresに同等のものがあるかどうかはわかりませんが、「偽造」する手法があります。たとえば、 INSERTの記述方法標準SQLでクエリが存在しない場合 。