La version courte :"Ça dépend".
La version longue :
Si vous effectuez un cycle de lecture-modification-écriture, non seulement cela doit être dans une transaction, mais vous devez également SELECT ... FOR UPDATE
tous les enregistrements que vous avez l'intention de modifier ultérieurement. Sinon, vous risquez de perdre des écritures, où vous écrasez une mise à jour effectuée par quelqu'un d'autre entre le moment où vous avez lu l'enregistrement et le moment où vous avez écrit la mise à jour.
SERIALIZABLE
l'isolation des transactions peut également aider à cela.
Vous devez vraiment comprendre la concurrence et l'isolement. Malheureusement, la seule réponse simple et facile "juste X" sans la comprendre est de commencer chaque transaction en verrouillant toutes les tables impliquées. La plupart des gens ne veulent pas faire ça.
Je suggère une lecture (ou deux, ou trois, ou quatre - c'est du matériel dur) de la documentation sur l'isolation tx
. Expérimentez avec psql
simultané sessions (terminaux multiples) pour créer des conditions de course et des conflits.