Açıklaması şöyle. Yani bir bir transaction tarafından "select for update" ile kilitlenmiş satırları hariç bırakır ve geri kalan satırları verir
Processing Non-Locked Database RowsSelect for update can be a rigid lock on your table. Concurrent processes can be blocked and starved out. Waiting is the slowest form of concurrent processing. If only one CPU can be active at a time, it is pointless to scale your servers. For this purpose, in PostgreSQL there is a mechanism for selecting only rows that are not locked.The select ... for update skip locked is a statement that allows you to query rows that have no locks. Let’s observe the following scenario to grasp its use case:
Örnek
Şöyle yaparız
//session 1BEGIN;SELECT * FROM student WHERE id=1 FOR UPDATE;//session 2SELECT * FROM student FOR UPDATE SKIP LOCKED;
Şöyle yaparız
Örnekprocess A: SELECT * FROM purchasesprocess A: WHERE processed = false FOR UPDATE SKIP LOCKED;process B: SELECT * FROM purchasesprocess B: WHERE created_at < now()::date - interval '1w';process B: FOR UPDATE SKIP LOCKED;-- process A selects and locks all unprocess rows-- process B selects all non locked purchases older than a weekprocess A: UPDATE purchases SET ...;process B: UPDATE purchases SET ...;
Şöyle yaparız. Burada aynı anda birden fazla kişi bu cümleyi çalıştırsa bile, birbirlerini beklemedikleri için aslında bir anlamda işleri bölüşerek çalıştırma imkanı oluyor. Mesela 100 tane satır varsa ve Limit 10 ise, yani 10'luk batch'ler halinde çalıştırıyorsak, 4 kişi paralel çalışabilir.
UPDATE scheduled_tasks st1 SET picked = true, … WHERE <instance> IN ( SELECT <instance> FROM scheduled_tasks st2 WHERE <due-condition> FOR UPDATE SKIP LOCKED LIMIT <limit>) RETURNING st1.*
Hiç yorum yok:
Yorum Gönder