同時リクエストの場合、重複した挿入で次の問題が発生しています。
私は2つのテーブルを持っています:
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 です。