SET TRANSACTION
Эта страница переведена при помощи нейросети GigaChat.
SET TRANSACTION
– установка характеристики текущей транзакции.
Синтаксис
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
Описание
Команда SET TRANSACTION
устанавливает характеристики текущей транзакции. Она не влияет ни на какие последующие транзакции. SET SESSION CHARACTERISTICS
задает характеристики транзакций по умолчанию для последующих транзакций сеанса. Эти значения по умолчанию могут быть переопределены с помощью SET TRANSACTION
для отдельной транзакции.
Доступные характеристики транзакции:
- уровень изоляции транзакции;
- режим доступа —
READ WRITE
илиREAD ONLY
; - отложенный режим —
DEFERRABLE
; - Снимок — только для текущей транзакции, не для установки по умолчанию в сессии.
Уровень изоляции транзакции определяет, какие данные транзакция может видеть при одновременном выполнении других транзакций:
READ COMMITTED
- Оператор может видеть только строки, зафиксированные до его начала. Это значение по умолчанию.
REPEATABLE READ
- Все операторы текущей транзакции могут видеть только строки, зафиксированные до выполнения первого запроса или оператора изменения данных в этой транзакции.
SERIALIZABLE
- Все операторы текущей транзакции могут видеть только строки, зафиксированные до выполнения первого запроса или оператора изменения данных в этой транзакции. Если шаблон чтения и записи среди параллельных
SERIALIZABLE
-транзакций создаст ситуацию, которая не могла бы произойти при любой последовательной обработке этих транзакций, одна из них будет отменена с ошибкойserialization_failure
.
Стандарт SQL определяет один дополнительный уровень, READ UNCOMMITTED
. В PostgreSQL READ UNCOMMITTED
рассматривается как READ COMMITTED
.
Уровень изоляции транзакции не может быть изменен после выполнения первого запроса или оператора изменения данных (SELECT
, INSERT
, DELETE
, UPDATE
, MERGE
, FETCH
, или COPY
) транзакции.
Режим доступа определяет, может ли транзакция вносить изменения в базу данных:
-
READ WRITE
(режим чтения и записи) — по умолчанию. Разрешены все типы SQL-команд. -
READ ONLY
(только для чтения) — в этом режиме запрещены следующие SQL-команды:INSERT
,UPDATE
,DELETE
,MERGE
,COPY FROM
, если они пытаются изменить не временные таблицы;- все команды
CREATE
,ALTER
,DROP
; COMMENT
,GRANT
,REVOKE
,TRUNCATE
;EXPLAIN ANALYZE
иEXECUTE
, если они вызывают одну из вышеуказанных команд.
Это ограничение реализует логическое поведение “только для чтения”, но не препятствует физической записи на диск, если это необходимо для внутренних операций PostgreSQL.
Свойство транзакции DEFERRABLE
не имеет эффекта, если транзакция также не является SERIALIZABLE
и READ ONLY
. Когда все три характеристики (SERIALIZABLE READ ONLY DEFERRABLE
) выбраны для транзакции, она может быть заблокирована при первом получении своего снимка, после чего она способна работать без обычной нагрузки транзакции SERIALIZABLE
и без какого-либо риска быть отмененной с ошибкой serialization_failure
. Этот режим хорошо подходит для длительных операций, например отчетов или резервного копирования.
Команда SET TRANSACTION SNAPSHOT
позволяет новой транзакции выполняться с тем же снимком, что и существующая транзакция. Предыдущая транзакция должна была экспортировать свой снимок с помощью функции pg_export_snapshot
. Эта функция возвращает идентификатор снимка, который должен быть передан в SET TRANSACTION SNAPSHOT
, чтобы указать, какой снимок необходимо импортировать. Идентификатор должен быть записан как строковый литерал в этой команде, например '00000003-0000001B-1'
. Команда SET TRANSACTION SNAPSHOT
может быть выполнена только в начале транзакции, перед первым запросом или оператором изменения данных (SELECT
, INSERT
, DELETE
, UPDATE
, MERGE
, FETCH
, или COPY
) транзакции. Кроме того, транзакция уже должна быть установлена на уровень изоляции SERIALIZABLE
или REPEATABLE READ
(в противном случае снимок будет немедленно отброшен, так как режим READ COMMITTED
создает новый снимок для каждой команды). Если импортируемая транзакция использует уровень изоляции SERIALIZABLE
, то транзакция, которая экспортировала снимок, также должна использовать этот уровень изоляции. Также транзакция с уровнем SERIALIZABLE
не может импортировать снимок из транзакции только для чтения.
Примечания
Если SET TRANSACTION
выполняется вне транзакции (то есть до BEGIN
или START TRANSACTION
), PostgreSQL выдает предупреждение, и команда не оказывает никакого эффекта.
Все характеристики транзакции можно также указать прямо при запуске транзакции, в командах BEGIN
или START TRANSACTION
. Исключение — SET TRANSACTION SNAPSHOT
, который можно задать только отдельной командой, а не как часть BEGIN
.
Режимы транзакций по умолчанию для сеанса также могут быть установлены или проверены с помощью параметров конфигурации default_transaction_isolation, default_transaction_read_only и default_transaction_deferrable. В действительности SET SESSION CHARACTERISTICS
является просто многословным эквивалентом установки этих переменных с использованием SET
. Это означает, что значения по умолчанию можно установить в файле конфигурации, через ALTER DATABASE
и так далее. Обратитесь к разделу «Конфигурация сервера» за дополнительной информацией.
Текущие режимы транзакции аналогичным образом могут быть установлены или просмотрены с помощью параметров конфигурации transaction_isolation, transaction_read_only и transaction_deferrable. Установка одного из этих параметров действует так же, как соответствующий параметр SET TRANSACTION
, с теми же ограничениями относительно того, когда это может быть сделано. Эти параметры нельзя установить в конфигурационном файле — только в рамках текущего SQL-сеанса.
Примеры
Чтобы начать новую транзакцию с тем же снимком, что и уже существующая транзакция, сначала экспортируйте снимок из существующей транзакции. Это вернет идентификатор снимка, например:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
pg_export_snapshot
---------------------
00000003-0000001B-1
(1 row)
Затем укажите идентификатор снимка в команде SET TRANSACTION SNAPSHOT
в начале вновь открытой транзакции:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';
Совместимость
Все команды, кроме DEFERRABLE
и SET TRANSACTION SNAPSHOT
, входят в стандарт SQL.
В стандарте SQL по умолчанию используется SERIALIZABLE
— в PostgreSQL это READ COMMITTED
, но его можно изменить.
Стандарт также определяет параметр для размера области диагностики, но это актуально только для встроенного SQL и не реализовано в PostgreSQL.
Стандарт SQL требует запятых между последовательными transaction_modes
, но по историческим причинам PostgreSQL позволяет опускать запятые.