La versione breve:"Dipende".
La versione lunga:
Se stai eseguendo un ciclo di lettura-modifica-scrittura, non solo deve essere in una transazione, ma devi SELECT ... FOR UPDATE
tutti i record che in seguito intendi modificare. Altrimenti rischi di perdere le scritture, in cui sovrascrivi un aggiornamento fatto da qualcun altro tra quando leggi il record e quando hai scritto l'aggiornamento.
SERIALIZABLE
anche l'isolamento delle transazioni può aiutare in questo.
Devi davvero capire la concorrenza e l'isolamento. Sfortunatamente l'unica risposta semplice e facile "fai solo X" senza capirlo è iniziare ogni transazione bloccando tutte le tabelle coinvolte. La maggior parte delle persone non vuole farlo.
Suggerisco una lettura (o due, o tre, o quattro - è materiale difficile) di i documenti di isolamento tx
. Sperimenta con psql
simultaneo sessioni (terminali multipli) per creare condizioni di gara e conflitti.