从我的代码(Java)我想确保在执行代码后数据库(DB2)中存在一行.
我的代码现在执行了一个select
,如果没有返回结果,它会执行insert
.我真的不喜欢这个代码,因为它在多线程环境中运行时会让我遇到并发问题.
我想要做的是将这个逻辑放在DB2而不是我的Java代码中.DB2有insert-or-update
声明吗?或者我可以使用的任何类似的东西?
例如:
insertupdate into mytable values ('myid')
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是始终执行insert并捕获"SQL-code -803主键已存在",但我想尽可能避免这种情况.
Checkstyle将此代码报告为"双重检查锁定习语已损坏",但我认为我的代码实际上并未受到双重检查锁定问题的影响.
如果不存在具有该id的行,则该代码应该在数据库中创建一行.它在多线程环境中运行,我想避免主键存在的SQL异常.
伪代码:
private void createRow(int id) {
Row row = dao().fetch(id);
if (row == null) {
synchronized (TestClass.class) {
row = dao().fetch(id);
if (row == null) {
dao().create(id);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我可以同意它看起来像双重检查锁定,但我没有使用静态变量,fetch()和create()中的代码可能太复杂,无法内联并使其无序.
我错了还是格式?:)