PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Devo includere SELECT in una transazione?

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.