Итак, я использую Java с Apache Derby и пытаюсь вставить запись, но только если запись с тем же ключом еще не существует, потому что все значения, которые я хочу, чтобы существовали в моем коде, а не в базе данных, которую я используйте фиктивную таблицу derbys (аналог DUAL для db2), это запрос, который я использую (md5 является первичным ключом)
PreparedStatement stmt = conn.prepareStatement("INSERT INTO artwork (md5,image) " +
"SELECT ?,?" +
"FROM SYSIBM.SYSDUMMY1 " +
"WHERE NOT EXISTS ( SELECT 1 FROM artwork WHERE md5=?)");
stmt.setString(1, key);
stmt.setBinaryStream(2, new ByteArrayInputStream(imageData), imageData.length);
stmt.setString(3, key);
и, похоже, это работает, однако, когда я выполняю многопоточный код, чтобы два потока могли пытаться вставить одно и то же произведение искусства, я получаю ошибки о вводе повторяющегося значения в index.
Если я синхронизирую метод так, чтобы только один поток мог вызывать метод одновременно, я не получаю таких ошибок, но это противоречит цели добавления значения WHERE NOT EXISTS в первую очередь.
Итак, мой запрос не делает то, что я думаю, или я неправильно понимаю общую концепцию?