因此,我将 Java 与 Apache Derby 一起使用,并且我正在尝试插入一条记录,但前提是不存在具有相同键的记录,因为我希望所有值都存在于我的代码而不是数据库中使用 derbys 虚拟表(类似于 DUAL for 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);
它似乎正在工作,但是当我对代码进行多线程处理以便两个线程可以尝试插入相同的艺术品时,我得到关于将重复值输入索引的错误。
如果我同步该方法,以便只有一个线程可以同时调用该方法,那么我不会收到此类错误,但这违背了首先添加 WHERE NOT EXISTS 值的目的。
那么我的查询是不是在做我认为它正在做的事情,还是我在这里误解了一个一般概念?