【发布时间】:2012-07-13 22:45:00
【问题描述】:
在并发请求的情况下,我遇到了重复插入的以下问题。
我有两张桌子:
create table tbl (
val varchar2(1000)
);
create table tbl2 (
val varchar2(1000)
);
我需要在表tbl2 中插入一些值,以防表tbl 为空。因此,在我的 Java 代码中,我使用隔离级别 = READ COMMITED 进行事务处理:
//start transaction
int result = jdbcTemplate.queryForInt("select count(*) from tbl");
if (result == 0) {
int update = jdbcTemplate.update("insert into tbl2(val) values(?)", "di" + UUID.randomUUID().toString());
}
//end transaction
这里的问题是:实际上有人可以在if (result == 0) 和我的更新语句之间插入数据。所以我会有重复的条目。
我的例子过于简单,但我的实际情况要复杂得多,但基本思想是一样的:我需要在插入之前从 Javacode 中进行几次选择。
那么,如何避免这种情况(我对 db 端解决方案和 java 端解决方案感兴趣)?
附:数据库是 Oracle。
【问题讨论】:
-
实际上我使用 2 个不同的应用程序来模拟这种情况:来自 IDE 的 java 代码,我将断点放在“if (result == 0)”行和 SQL 开发人员插入新行并执行提交
标签: java sql transactions transactionscope