在并发请求的情况下,我遇到了重复插入的以下问题。
我有两张桌子:
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 端解决方案感兴趣)?
PS数据库是Oracle。