我正在尝试编写一个查询,仅当用户没有超过两个已打开的活动索赔时,将“claim”表中的一行更新为活动状态。因此,对于数据完整性来说,用户永远不能同时拥有超过两个活动索赔是非常重要的。
我在并发环境下运行此查询,因此可能会有两个进程同时执行此查询。我还在默认的读取提交
隔离级别下运行它。
我想知道我是否存在这样的可能性:由于子选择和更新子句之间的竞争条件,用户可能在某个时候拥有超过两个活动索赔。
同样注意,对于此查询而言,性能远不及数据完整性重要。
update claim
set is_active = '1'
where claim.id = %s
and (2 > (select count(*)
from claim as active_claim
where active_claim.user_id = %s
and active_claim.is_active = '1'))