Чи можна вибрати дані, вставлені в ту саму некомплектну транзакцію?


21

Можливо, це питання німий для початківців, але я не можу знайти відповіді ніде. Скрізь я читав про те, Transaction Isolationщо вирішує видимість даних у межах одночасних транзакцій. Моє занепокоєння - поведінка в рамках однієї транзакції.

Якщо я розпочну транзакцію, вставте деякі дані, чи зможу їх вибрати відразу після - все ж у межах тієї самої, ще не виконаної транзакції? Якщо так, чи може ця поведінка змінитися аналогічно, як згадана Ізоляція транзакцій у випадку одночасних транзакцій?

Щоб бути конкретним, я орієнтуюся на PostgreSQL 9.4.

Відповіді:


17

Так.
Все, що ви робили всередині однієї транзакції, видно для пізніших команд всередині тієї самої транзакції. Тільки не для інших операцій, поки їх не буде здійснено. Це стосується всіх рівнів ізоляції, за винятком випадків, Read uncommittedколи можливі "брудні читання" (але це не впливає на ваше запитання як таке).

Він реалізований за допомогою моделі MVCC (Multiversion Concurrency Control) на основі TransactionIdвизначення віку та видимості для кожного рядка таблиці. Кожна нова версія рядка, написана в одній транзакції, стає однаковою xminі вважається, що вона сталася "в той же час".

В одній команді є кутовий випадок для декількох CTE (Загальна таблична виразність) . Можна подумати, що вони виконуються послідовно, але якщо один CTE не посилається на інший, їх послідовність є довільною. І всі вони бачать однаковий знімок із початку запиту.

Приклад:

Розширений приклад:


3

Спробуймо :

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$

Тепер перевіримо:

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

Це працює ! Як сказав Ервін, все, що робиться в транзакції, видно всередині транзакції. Ізоляція лише між різними нитками.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.