Могу ли я выбрать данные, вставленные в ту же незафиксированную транзакцию?

21

Может быть, это глупый вопрос для начинающих, но я нигде не могу найти ответ. Везде я читал о том, Transaction Isolationчто решает видимость данных в параллельных транзакциях. Меня беспокоит поведение внутри одной транзакции.

Если я начну транзакцию, вставлю некоторые данные, смогу ли я выбрать их сразу после - все еще в рамках той же, но еще не принятой, транзакции? Если да, может ли это поведение быть изменено аналогично упомянутой изоляции транзакций в случае одновременных транзакций?

Если быть точным, я нацеливаюсь на PostgreSQL 9.4.

Номер четыре
источник

Ответы:

17

Да.
Все, что вы делали внутри одной и той же транзакции, видно последующим командам внутри той же транзакции. Только не для других транзакций, пока не совершено. Это верно для всех уровней изоляции, кроме случаев, Read uncommittedкогда возможно «грязное чтение» (но это не влияет на ваш вопрос как таковой).

Он реализован с использованием модели MVCC (Multiversion Concurrency Control), основанной на TransactionIdопределении возраста и видимости для каждой строки таблицы. Каждая новая версия строки, записанная в одной и той же транзакции, получает одно xminи то же и считается, что она произошла «в одно и то же время».

В одной и той же команде есть угловой случай для нескольких CTE (Common Table Expression) . Можно подумать, что они выполняются последовательно, но если один 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"}

Оно работает ! Как сказал Эрвин, все, что сделано в транзакции, видно внутри транзакции. Изоляция только между разными нитями.

коуш
источник