.
Postgres 9.5 ( ) SKIP LOCKED :
:
UPDATE opportunities s
SET opportunity_available = false
FROM (
SELECT id
FROM opportunities
WHERE deal_id =
AND opportunity_available
AND pg_try_advisory_xact_lock(id)
LIMIT 1
FOR UPDATE
) sub
WHERE s.id = sub.id
RETURNING s.prize_id, s.id;
- .
- option_available - ,
opportunity_available = true opportunity_available * , id .
, , . .
, CTE OFFSET 0 hack ( ), pg_try_advisory_xact_lock() :
UPDATE opportunities s
SET opportunity_available = false
FROM (
SELECT id
FROM (
SELECT id
FROM opportunities
WHERE deal_id =
AND opportunity_available
AND pg_try_advisory_xact_lock(id)
OFFSET 0
) sub1
WHERE pg_try_advisory_xact_lock(id)
LIMIT 1
FOR UPDATE
) sub2
WHERE s.id = sub.id
RETURNING s.prize_id, s.id;
, .
, ,
"" , , , :
CREATE INDEX opportunities_deal_id ON opportunities (deal_id)
WHERE opportunity_available;
EXPLAIN, , Postgres . , pg_try_advisory_xact_lock(id) , ( ) , . . .
, . , . , ? ?
, , .