Posso selecionar os dados inseridos na mesma transação não confirmada?

21

Talvez essa seja uma pergunta idiota para iniciantes, mas não consigo encontrar uma resposta em lugar algum. Em todo lugar, leio sobre o Transaction Isolationque resolve a visibilidade dos dados nas 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 depois - ainda na mesma transação, ainda que não confirmada? Em caso afirmativo, esse comportamento pode ser alterado de maneira semelhante ao isolamento de transação mencionado no caso de transações simultâneas?

Para ser específico, estou direcionando o PostgreSQL 9.4.

Numero quatro
fonte

Respostas:

17

Sim.
Tudo o que você fez dentro da mesma transação é visível para comandos posteriores dentro da mesma transação. Só não para outras transações até que sejam confirmadas. Isso é válido para todos os níveis de isolamento, exceto Read uncommittedonde "leituras sujas" são possíveis (mas isso não afeta sua pergunta por si só).

Ele é implementado com o modelo MVCC (Multiversion Concurrency Control) com base em TransactionIds determinando a idade e a visibilidade para cada linha da tabela. Toda nova versão de linha gravada na mesma transação fica igual xmine é considerada como tendo ocorrido "ao mesmo tempo".

Há uma caixa de canto para vários CTEs (Common Table Expression) no mesmo comando. Pode-se pensar que esses são executados seqüencialmente, 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.

Exemplo:

Exemplo avançado:

Erwin Brandstetter
fonte
3

Vamos tentar :

CREATE OR REPLACE FUNCTION public.sp_get_user()
 RETURNS json
 LANGUAGE plpgsql
AS $function$BEGIN

INSERT INTO users (name, password) VALUES ('deadeye', 'test');
RETURN row_to_json(row) FROM (SELECT name, password FROM users WHERE name = 'deadeye') row;

END;$function$

Agora, vamos testar:

SELECT sp_get_user();
{"name":"deadeye","password":"test"}

Funciona ! Como disse Erwin, tudo o que é feito em uma transação é visível dentro da transação. O isolamento é apenas entre segmentos diferentes.

DeadEye
fonte