如何防止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查询,所以它不能锁定任何东西,并且所有并行线程都得到相同的计数,最后每个线程插入一行。此解决方案非常适用于其他UPDATE用例。

我的建议如下。

  1. 创建一个新表,每个活动和每个用户一行
  2. 用";使用";来自CCD_ 1的限制
  3. 还具有一列;使用";行。默认值为0
  4. 添加一个check约束used_issues <= issue_limit
  5. B上创建一个触发器,以使inserts、deletes和updates的值保持最新

瞧!该限制将通过check约束进行验证。

相关内容

  • 没有找到相关文章

最新更新