PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Devo incluir SELECTs em uma transação?


A versão curta:"Depende".

A versão longa:

Se você estiver fazendo um ciclo de leitura-modificação-gravação, não apenas deve estar em uma transação, mas você deve SELECT ... FOR UPDATE quaisquer registros que você pretenda modificar posteriormente. Caso contrário, você correrá o risco de perder gravações, onde substituirá uma atualização feita por outra pessoa entre quando você leu o registro e quando escreveu a atualização.

SERIALIZABLE o isolamento da transação também pode ajudar com isso.

Você realmente precisa entender a simultaneidade e o isolamento. Infelizmente, a única resposta simples e fácil "apenas faça X" sem entendê-la é iniciar cada transação bloqueando todas as tabelas envolvidas. A maioria das pessoas não quer fazer isso.

Sugiro uma leitura (ou duas, ou três, ou quatro - é material difícil) de os documentos de isolamento tx . Experimente com psql simultâneo sessões (vários terminais) para criar condições de corrida e conflitos.