Перейти к основному содержимому

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) транзакции.

Режим доступа определяет, может ли транзакция вносить изменения в базу данных:

  1. READ WRITE (режим чтения и записи) — по умолчанию. Разрешены все типы SQL-команд.

  2. 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 позволяет опускать запятые.