在竞争条件下,如何根据表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用例。
我的建议如下。
- 创建一个新表,每个活动和每个用户一行
- 用";使用";来自CCD_ 1的限制
- 还具有一列;使用";行。默认值为
0
- 添加一个
check
约束used_issues <= issue_limit
- 在
B
上创建一个触发器,以使insert
s、delete
s和update
s的值保持最新
瞧!该限制将通过check
约束进行验证。