Postgres UPDATE FROM SELECT statment

时间:2015-06-25 20:42:43

标签: sql postgresql race-condition

我注意到我的网络应用程序中的以下查询创建了一个竞争条件,导致了一个不准确的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.*;

0 个答案:

没有答案