SET TRANSACTION#

SET TRANSACTION

SET TRANSACTION

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 COMMITTED

Оператор может видеть только строки, подтвержденные до его начала. Это значение по умолчанию.

REPEATABLE READ

Все операторы текущей транзакции могут видеть только строки, подтвержденные до выполнения первого оператора запроса или модификации данных в этой транзакции.

SERIALIZABLE

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

Стандарт SQL определяет один дополнительный уровень, READ UNCOMMITTED. В Tantor BE READ UNCOMMITTED рассматривается как READ COMMITTED.

Уровень изоляции транзакции не может быть изменен после выполнения первого запроса или оператора модификации данных (SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH, или COPY) в транзакции. Смотрите Глава 13 для получения дополнительной информации об изоляции транзакций и контроле согласованности.

Режим доступа к транзакции определяет, является ли транзакция для чтения/записи или только для чтения. По умолчанию используется чтение/запись. Когда транзакция только для чтения, следующие SQL команды запрещены: INSERT, UPDATE, DELETE, MERGE, и COPY FROM, если таблица, в которую они должны были бы записать, не является временной таблицей; все команды CREATE, ALTER, и DROP; COMMENT, GRANT, REVOKE, TRUNCATE; и EXPLAIN ANALYZE и EXECUTE, если команда, которую они должны были бы выполнить, находится среди перечисленных. Это высокоуровневое понятие "только для чтения", которое не предотвращает все записи на диск.

Все свойства транзакции DEFERRABLE не имеют эффекта, если транзакция также не является SERIALIZABLE и READ ONLY. Когда все три свойства выбраны для транзакции, транзакция может заблокироваться при первом получении своего снимка, после чего она может работать без нормальных издержек транзакции SERIALIZABLE и без риска участия в или отмены из-за сбоя сериализации. Этот режим хорошо подходит для долгосрочных отчетов или резервных копий.

Команда SET TRANSACTION SNAPSHOT позволяет новой транзакции работать с тем же снимком, что и существующая транзакция. Предварительно существующая транзакция должна была экспортировать свой снимок с помощью функции pg_export_snapshot (см. Раздел 9.27.5). Эта функция возвращает идентификатор снимка, который должен быть передан SET TRANSACTION SNAPSHOT для указания, какой снимок должен быть импортирован. Идентификатор должен быть записан как строковый литерал в этой команде, например '00000003-0000001B-1'. SET TRANSACTION SNAPSHOT может быть выполнена только в начале транзакции, до первого запроса или операции модификации данных (SELECT, INSERT, DELETE, UPDATE, MERGE, FETCH, или COPY) транзакции. Кроме того, транзакция уже должна быть установлена на уровень изоляции SERIALIZABLE или REPEATABLE READ (в противном случае снимок будет немедленно отброшен, поскольку режим READ COMMITTED создает новый снимок для каждой команды). Если импортирующая транзакция использует уровень изоляции SERIALIZABLE, то транзакция, которая экспортировала снимок, также должна использовать этот уровень изоляции. Также, не-только-для-чтения сериализуемая транзакция не может импортировать снимок из транзакции только для чтения.

Примечания

Если выполнить команду SET TRANSACTION без предварительного выполнения команды START TRANSACTION или BEGIN, будет выдано предупреждение, и в остальном это не будет иметь никакого эффекта.

Можно обойтись без команды SET TRANSACTION, указав желаемые transaction_modes в командах BEGIN или START TRANSACTION. Однако эта опция недоступна для команды SET TRANSACTION SNAPSHOT.

Варианты транзакций по умолчанию для сессии также могут быть установлены или проверены с помощью параметров конфигурации default_transaction_isolation, default_transaction_read_only и default_transaction_deferrable. (Фактически, SET SESSION CHARACTERISTICS является только подробным эквивалентом для установки этих переменных с помощью SET). Это означает, что значения по умолчанию могут быть установлены в файле конфигурации, с помощью ALTER DATABASE и т. д. Дополнительную информацию см. в разделе Глава 18.

Все текущие режимы транзакции также могут быть установлены или проверены с помощью параметров конфигурации 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';

Совместимость

Эти команды определены в стандарте SQL, за исключением режима транзакции DEFERRABLE и формы SET TRANSACTION SNAPSHOT, которые являются расширениями Tantor BE.

SERIALIZABLE - это уровень изоляции транзакций по умолчанию в стандарте. В Tantor BE по умолчанию обычно используется READ COMMITTED, но вы можете изменить его, как указано выше.

В стандарте SQL есть еще одна характеристика транзакции, которую можно установить с помощью этих команд: размер области диагностики. Эта концепция специфична для встроенного SQL и, следовательно, не реализована в сервере Tantor BE.

Стандарт SQL требует наличия запятых между последовательными transaction_modes, но по историческим причинам Tantor BE позволяет опускать запятые.