我注意到我的网络应用程序中的以下查询创建了一个竞争条件,导致了一个不准确的quantity_remaining金额。我的应用程序使用此查询返回的行中的值,并将它们(以及其他数据)插入到一个名为charges
的单独表中。但是,我注意到,在此声明运行数百或数千次之后,剩余数量仍然高于应有的数量 - 我已经在费用表中插入了更多行而不是我减少了数量其余
我无法推断出问题是什么,因为UPDATE部分应该以原子方式执行。我知道当quantity_remaining接近0时存在竞争条件,但是当剩余数量达到数万并且没有快速接近零时,我发现问题。
此查询中的竞争条件是什么导致它从lro
返回行而不减少quantity_remaining,且quantity_remaining不接近零?请注意,我使用 PostgreSQL 9.3.3 。
UPDATE reservations SET quantity_remaining = quantity_remaining - 1
FROM (
SELECT lr.id, lo.base_price, lo.page_price
FROM reservations lr INNER JOIN offerings lo ON lr.offering_id = lo.id
WHERE lr.account_id = 'some-id'
AND lo.type = 'blue'
AND lr.quantity_remaining > 0
AND lr.end_date >= now()
ORDER BY lr.start_date ASC LIMIT(1)
) AS lro
WHERE reservations.id = lro.id
AND reservations.quantity_remaining > 0
RETURNING lro.*;