【发布时间】:2013-10-18 14:10:29
【问题描述】:
我们有一个代码可以将一个新值插入到作为主键的表列中。 首先,我们进行选择,如果该值不存在,则进行插入。
query = "SELECT AValue from ATableCache WHERE AValue=" + avalue;
ResultSet rs = stmt.executeQuery(query);
if (!rs.next())
{
query = "INSERT INTO ATableCache (AValue) VALUES ('" + avalue + "')";
stmt.executeUpdate(query);
}
在竞争条件下,当插入一个刚刚被另一个线程插入的值时,此算法可能会导致 SQL 错误。选项之一是同步,但这会减慢执行速度。请注意,插入很少发生。有没有更高效的算法?
【问题讨论】:
-
你的方法同步了吗?
-
如果插入很少发生,为什么还要担心同步会减慢执行速度?
-
那么为什么不尝试无条件地插入呢?检查错误代码是否 == 密钥违规以确定它是否有效/失败。
标签: java sql multithreading postgresql