Giriş
READPAST skips through rows that are locked for update by other transactions but ONLY when the query you execute is about to get blocked on locked rows. So READPAST doesn’t skip locked rows on normal select queries because it can read from a snapshot (MVCC)
Örnek
Tabloda 1,2,3,4,5 satırları olsun. Şöyle
yaparız-- run transaction 1 and don’t commit;
BEGIN TRANSACTION;
UPDATE T SET F = 100 WHERE F = 1
-- in another transaction do
SELECT * FROM T WITH (READPAST)
Burada sonuç olarak 2,3,4,5 alırız. 1 numaralı satır atlandı
BEGIN TRANSACTION;
UPDATE T WITH (READPAST)
SET F = 900 WHERE F < 10;
Burada 2,3,4,5 numaralı satırla güncellenir ama 1 numaralı satır atlanır. Aynı şeyi şöyle de
yapabilirizBEGIN TRANSACTION;
UPDATE T
SET F = 900 WHERE F IN( SELECT F FROM T WITH READPAST WHERE F < 10)
Ama şöyle yapsaydık bloke
olurdu. Çünkü WITH READPAST kullanılmadı
BEGIN TRANSACTION;
UPDATE T
SET F = 900 WHERE F < 10;