问题描述
在竞争条件下,如何根据表 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 (将#修改为@)