Итак, я использую Java с Apache Derby, и я пытаюсь вставить запись, но только если запись с тем же ключом еще не существует, потому что все значения, которые я хочу, чтобы существовать в моем коде, а не в базе данных я использую derbys фиктивный таблицу (аналог DUAL для db2) это запрос я использую (md5 это первичный ключ)Использование WHERE NOT EXISTS с таблицей фиктивной таблицы, не работающей с базой данных Apache Derby
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);
и казалось, что он работает, однако, когда я многопоточно переписываю код, чтобы два потока могли пытаться вставить те же произведения, я получаю ошибки получения ввода двойного значения в индекс.
Если я синхронизирую метод, так что только один поток может вызвать метод одновременно, то я не получаю таких ошибок, но это побеждает цель добавления значения WHERE NOT EXISTS.
Так что мой запрос не делает то, что я думаю, что он делает, или я не понимаю общую концепцию здесь?
Вы пытались использовать транзакции? – Romain
Не видите, как это связано –
Я не вижу, как транзакции помогут в этой ситуации. К OP: есть ли что-то неправильное, просто допуская ошибки повторяющихся значений и игнорируя их? Это будет сделано с той же целью. – ean5533