Oracle中如何防止并发INSERT

问题描述

在竞争条件下,如何根据表 B 中定义的允许行数验证插入到表 A 的行数。

#Table A
CAMPAIGN_ID     ISSUE_LIMIT_PER_USER
-----------     --------------------
1000000111      1

#Table B
OFFER_ID    USER_ID     CAMPAIGN_ID   START_DATE  END_DATE
--------    -------     -----------   ----------  --------
11111111    90000       1000000111    2021-06-27  2021-07-27   Request1 allowed 
22222222    90000       1000000111    2021-06-28  2021-07-28   Request2 disallowed
33333333    90000       1000000111    2021-06-29  2021-07-29   Request3 disallowed

注意:表 B 中没有 UNIQUE 约束。因为我们可以基于多行 ISSUE_LIMIT_PER_USER 的值。

这里的要求是,当有多个并行请求时,如何防止在表 B 中插入超过 1 条记录(因为 ISSUE_LIMIT_PER_USER = 1)。

在 SQL 下面我尝试过但没有工作。

INSERT INTO B(,) SELECT (,) FROM DUAL WHERE (SELECT COUNT(OFFER_ID) FROM B WHERE 
CAMPAIGN_ID=:campaign_id < :issue_limit_per_user

因为它是一个 INSERT 查询,所以它不能锁定任何东西,并且所有并行线程获得相同的计数并最终每个插入 1 行。此解决方案非常适合其他 UPDATE 用例。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)