Search Postgresql Archives

Is "WITH () UPDATE" Thread Safe ?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,


I have a lot of tickets, i need to take a batch of tickets and process them.
So the process is :
SELECT ONLY 100 tickets
PROCESS ticket
MARK THEM AS « done »

I’m selecting the tickets with :

WITH t0 AS (
    SELECT t.id, 
RANDOM() AS rank,
EXTRACT(EPOCH FROM NOW() - b.created_at) as elapsed
    FROM tickets AS t
    LEFT JOIN batch as b ON b.id = t.batch_id
    WHERE (
        t.status = 'waiting' OR
        (t.status = 'processing' AND t.locked_until IS NOT NULL AND t.locked_until <= NOW())
    ) AND t.send_at < NOW()
    AND (t.send_before IS NULL OR t.send_before > NOW())
    ORDER BY 
        t.priority DESC,
        rank ASC
    LIMIT 100
    FOR UPDATE OF t
)
UPDATE tickets AS t1
SET status = 'processing',
    locked_until = NOW() + '1 HOUR’,
    extra = t1.extra || hstore('elapsed', t0.elapsed || '') || hstore('rank', rank || '')
FROM t0
WHERE t1.id = t0.id
RETURNING t1.*;


I wonder if this query is thread safe, Can a ticket be updated between the SELECT part (t0) and the UPDATE part ?
If this query is not « thread safe » how can i do this ?

-- 
Paul

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux