SET TRANSACTION#
SET TRANSACTION
SET TRANSACTION — установить характеристики текущей транзакции
Синтаксис
SET TRANSACTIONtransaction_mode
[, ...] SET TRANSACTION SNAPSHOTsnapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTIONtransaction_mode
[, ...] wheretransaction_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 позволяет опускать запятые.