È vero che INSERT , UPDATE o DELETE deve acquisire ROW EXCLUSIVE blocco sulla tabella da aggiornare.
Tuttavia, questo blocco non impedisce SELECT dal lavorare normalmente. SELECT richiede solo ACCESS SHARE serratura. Questo lucchetto è compatibile con ROW EXCLUSIVE - in altre parole, puoi eseguire perfettamente SELECT mentre gli altri dati vengono aggiornati da INSERT , UPDATE o DELETE , purché non si acquisiscano blocchi espliciti.
In altre parole, non dovresti mai vedere alcun deadlock usando il secondo approccio (basta non usare SELECT FOR UPDATE e starai bene).
Maggiori informazioni nella documentazione PostgreSQL .