【发布时间】:2010-09-24 17:17:17
【问题描述】:
从我的代码 (Java) 中,我想确保在我的代码执行后数据库 (DB2) 中存在一行。
我的代码现在执行select,如果没有返回结果,它执行insert。我真的不喜欢这段代码,因为它让我在多线程环境中运行时遇到并发问题。
我想做的是把这个逻辑放在 DB2 中,而不是放在我的 Java 代码中。
DB2 是否有insert-or-update 语句?或者我可以使用的任何类似的东西?
例如:
insertupdate into mytable values ('myid')
另一种方法可能是始终执行插入并捕获“SQL-code -803 主键已存在”,但如果可能的话,我想避免这种情况。
【问题讨论】:
-
每个线程一个事务不是更好吗? DBMS 擅长多线程,这就是发明事务的原因。他们会解决并发问题。
-
这并不能解决并发问题,因为事务只能通过阻塞已经存在的行来工作。如果该行不存在,则事务无法对其进行阻塞,因此这种操作仍然存在并发问题
标签: sql database db2 insert-update upsert