55P03: lock_not_available
PostgreSQLNe demek?
İstenen lock hemen alınamadı. Genellikle NOWAIT ile lock istenip başkasının o lock'u tutması ya da lock_timeout süresinin dolması sonucu oluşur.
Neden olur?
SELECT ... FOR UPDATE NOWAIT veya LOCK TABLE ... NOWAIT kullanımı sırasında satır/tablonun kilitli olması; ya da lock_timeout değerinin dolması. Çoğu zaman lock'u tutan uzun bir transaction vardır.
Nasıl çözülür?
Engelleyen oturumu bulun: pg_locks ve pg_stat_activity'yi birleştirin (waiting/blocking ilişkisi). Uzun transaction'ı bitirin veya gerekirse pg_terminate_backend(pid) ile sonlandırın. NOWAIT yerine makul bir lock_timeout ile bekleyip yeniden deneme mantığı kurun. Transaction'ları kısaltarak lock tutma süresini azaltın.