我遇到以下問題,如果發生併發請求時出現重複插入。重複插入
我有兩個表:
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端解決方案感興趣)?
P.S.數據庫是Oracle。
其實我用2個不同的應用程序來模擬這種情況下:從IDE,這裏我把斷點 Java代碼一行「if(result == 0)」 和SQL開發人員在哪裏插入新行並提交 – hades 2012-07-13 22:58:14