Transaction'ı Uzun Tutmanın Bedeli
Lock, vacuum ve replica aynı kuyrukta

CSV import'u tek BEGIN/COMMIT yaptım. 200 bin satır, arada doğrulama, arada HTTP. Row Exclusive birikti, ANALYZE bekledi, sonradan gelen UPDATE'ler kuyruğa girdi. Kullanıcı 'kayıt takıldı' dedi. Takılmadı; benim transaction'ım bitmedi.
Vacuum neden skip eder
Eski xmin'i gören bir snapshot durduğu sürece ölü satır kesilemez. 14 dakikalık import, o sürede yapılan UPDATE'lerin çöpünü de tuttu. Bloat bir gecede değil, uzun iş sırasında büyür.
SELECT pid, state, wait_event_type, now() - xact_start AS xact_age,
left(query, 80) AS query
FROM pg_stat_activity
WHERE xact_start IS NOT NULL
ORDER BY xact_start;
xact_age 2 dakikayı geçince alarm. Import'u 2000 satırlık batch + her batch commit yaptım. Hata olursa o batch geri alır, 14 dakikalık görünmezlik olmaz. Dış HTTP transaction içinde yok.
Replica
Uzun transaction WAL'ı da geciktirmez sanılıyor. Büyük commit anında replica apply kuyruğu şişer. Kullanıcı yazıyı kaydedip hemen replica'dan okuyunca boş görür — bunu son yazıda açıyorum. Burada kesilen şey: işi kısa tutmak. Uzun iş varsa, uzun iş ayrı bağlantıda ve parçalı.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap