Czy mogę wybrać dane wstawione w tej samej niezaangażowanej transakcji?

21

Może to głupie pytanie dla początkujących, ale nigdzie nie mogę znaleźć odpowiedzi. Wszędzie czytam o tym, Transaction Isolationco rozwiązuje widoczność danych w ramach jednoczesnych transakcji. Moje obawy dotyczą zachowania w ramach jednej transakcji.

Jeśli rozpocznę transakcję, wstawię jakieś dane, czy będę mógł je wybrać zaraz po - nadal w ramach tej samej, ale niezaangażowanej transakcji? Jeśli tak, czy to zachowanie można zmienić w podobny sposób, jak wspomniana izolacja transakcji w przypadku transakcji równoległych?

Mówiąc ściślej, celuję w PostgreSQL 9.4.

Numer cztery
źródło

Odpowiedzi:

17

Tak.
Wszystko, co zrobiłeś w ramach tej samej transakcji, jest widoczne dla późniejszych poleceń w tej samej transakcji. Tylko nie do innych transakcji, dopóki nie zostaną zatwierdzone. Dotyczy to wszystkich poziomów izolacji, z wyjątkiem sytuacji, w Read uncommittedktórych możliwe są „nieczytelne odczyty” (ale to nie wpływa na twoje pytanie per se).

Jest zaimplementowany z modelem MVCC (Multiversion Concurrency Control) w oparciu o TransactionIds określające wiek i widoczność dla każdego wiersza tabeli. Każda nowa wersja wiersza zapisana w tej samej transakcji jest taka sama xmini uważa się, że wydarzyła się „w tym samym czasie”.

W tym samym poleceniu występuje przypadek narożny dla wielu CTE (Common Table Expression) . Można by pomyśleć, że są one wykonywane sekwencyjnie, ale dopóki jedno CTE nie odwołuje się do drugiego, ich sekwencja jest dowolna. Wszystkie widzą tę samą migawkę od początku zapytania.

Przykład:

Zaawansowany przykład:

Erwin Brandstetter
źródło
3

Spróbujmy :

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$

Teraz przetestujmy:

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

To działa ! Jak powiedział Erwin, wszystko dokonane w transakcji jest widoczne wewnątrz transakcji. Izolacja odbywa się tylko między różnymi wątkami.

DeadEye
źródło