.
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)
, ( ) , . . .
, . , . , ? ?
, , .