【发布时间】:2014-09-28 03:10:44
【问题描述】:
我正在尝试编写一个查询,仅当用户尚未打开两个以上的活动声明时,才将“声明”表中的一行更新为活动状态。因此,对于数据完整性而言,用户从不在任何给定时间打开的有效声明不超过两个。
我在并发环境中运行此查询,因此两个进程可能同时执行此查询。我也在默认的Read Committed隔离级别下运行它。
我想知道,由于 subselect 和 update 子句之间的竞争条件,我是否愿意接受用户在某个时候打开两个以上的活动声明的可能性。
同样,对于此查询,性能并不像数据完整性那么重要。
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'))
【问题讨论】:
-
很好地考虑了并发性,而不是仅仅假设“事务”会神奇地解决并发问题;它已经让你领先于 99% 的人。 (不过,将来也请在您的问题中包含您的 PostgreSQL 版本)。
-
我使用的是 9.3 作为参考。
标签: sql postgresql concurrency race-condition