Talvez esta seja uma pergunta idiota para iniciantes, mas não consigo encontrar uma resposta em nenhum lugar. Em todos os lugares eu li sobre o Transaction Isolation
que resolve a visibilidade dos dados dentro das transações simultâneas. Minha preocupação é o comportamento dentro de uma única transação.
Se eu iniciar uma transação, inserir alguns dados, poderei selecioná-los logo após - ainda dentro da mesma transação, mas não confirmada? Se sim, esse comportamento pode ser alterado de forma semelhante ao Isolamento de Transação mencionado no caso de transações simultâneas?
Para ser específico, estou direcionando o PostgreSQL 9.4.
Sim.
Tudo o que você fez dentro da mesma transação é visível para comandos posteriores dentro da mesma transação. Apenas não para outras transações até que sejam confirmadas. Isso é verdade para todos os níveis de isolamento, exceto
Read uncommitted
onde "leituras sujas" são possíveis (mas isso não afeta sua pergunta em si).Ele é implementado com o modelo MVCC (Multiversion Concurrency Control) baseado em
TransactionId
s determinando idade relativa e visibilidade para cada linha da tabela. Cada nova versão de linha escrita na mesma transação obtém o mesmoxmin
e é considerada como tendo acontecido "ao mesmo tempo".Há um caso de canto para vários CTEs (Common Table Expression) no mesmo comando. Pode-se pensar que eles são executados sequencialmente, mas a menos que um CTE faça referência ao outro, sua sequência é arbitrária. E todos eles veem o mesmo instantâneo desde o início da consulta. É por isso que não é permitido
UPDATE
a mesma linha mais de uma vez em vários CTEs da mesma consulta: seria ambíguo.Exemplo:
Exemplo avançado:
Vamos tentar :
Agora, vamos testar:
Funciona! Como disse Erwin, tudo o que é feito em uma transação é visível dentro da transação. O isolamento é apenas entre threads diferentes.