SET TRANSACTION
Устанавливает характеристики текущей транзакции.
Синтаксис
SET TRANSACTION [<transaction_mode>] [READ ONLY | READ WRITE]
SET TRANSACTION SNAPSHOT <snapshot_id>
SET SESSION CHARACTERISTICS AS TRANSACTION <transaction_mode>
[READ ONLY | READ WRITE]
[NOT] DEFERRABLE
где transaction_mode может быть:
ISOLATION LEVEL {SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED}
и snapshot_id — это идентификатор существующей транзакции, снимок которой вы хотите использовать для выполнения данной транзакции.
Описание
Команда SET TRANSACTION устанавливает характеристики текущей транзакции. Она не влияет на последующие транзакции.
Доступные характеристики транзакций включают уровень изоляции транзакций, режим доступа транзакции (чтение/запись или только чтение) и отложенный режим.
Для откладываемых транзакций требуется, чтобы транзакция была сериализуемой. Greengage DB не поддерживает сериализуемые транзакции, поэтому указание выражения DEFERRABLE не имеет эффекта.
Уровень изоляции транзакции определяет, какие данные она может видеть, когда одновременно с ней выполняются другие транзакции:
-
READ COMMITTED— оператор может видеть только строки, зафиксированные до начала его выполнения. Этот уровень используется по умолчанию. -
REPEATABLE READ— в текущей транзакции все операторы могут видеть только строки, зафиксированные до выполнения первого запроса или оператора изменения данных в рамках этой транзакции.
Стандарт SQL определяет два дополнительных уровня: READ UNCOMMITTED и SERIALIZABLE. В Greengage DB уровень READ UNCOMMITTED рассматривается как READ COMMITTED. Если указать SERIALIZABLE, Greengage DB вернется к уровню REPEATABLE READ.
Уровень изоляции транзакции нельзя изменить после выполнения первого запроса или оператора изменения данных (SELECT, INSERT, DELETE, UPDATE, FETCH или COPY) в рамках транзакции.
Режим доступа транзакции определяет, будет ли транзакция только читать данные или будет и читать, и писать. По умолчанию используется режим чтения/записи. При режиме только чтения запрещены следующие команды SQL:
-
INSERT,UPDATE,DELETE,COPY FROM— если таблица, в которую они будут записываться данные, не является временной; -
все команды
CREATE,ALTERиDROP; -
GRANT,REVOKE,TRUNCATE; -
EXPLAIN ANALYZEиEXECUTE— если команда, которую они должны выполнить, относится к вышеперечисленным.
Это высокоуровневое определение режима только для чтения, которое в принципе не исключает запись на диск.
Свойство транзакции DEFERRABLE не оказывает никакого эффекта, если транзакция не является одновременно SERIALIZABLE и READ ONLY. Когда для транзакции установлены все эти свойства, она может блокироваться при первом получении снимка, после чего может выполняться без дополнительных усилий, характерных для транзакций SERIALIZABLE, и без риска возникновения сбоя или отмены из-за ошибки сериализации. Поскольку Greengage DB не поддерживает сериализуемые транзакции, свойство транзакции DEFERRABLE не оказывает никакого эффекта в Greengage DB.
Параметры
| Параметр | Описание |
|---|---|
SNAPSHOT |
Позволяет выполнить новую транзакцию с тем же снимком данных, который имеет уже существующая транзакция. Идентификатор существующей транзакции передается в команду |
SESSION CHARACTERISTICS |
Устанавливает характеристики транзакций по умолчанию для последующих транзакций в рамках одной сессии |
READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE |
Стандарт SQL определяет четыре уровня изоляции транзакций:
Уровень изоляции Уровень изоляции транзакций |
READ WRITE READ ONLY |
Определяет, будет ли транзакция читать и писать данные или только читать. По умолчанию используется чтение/запись. При режиме только чтения запрещены следующие команды SQL: |
[NOT] DEFERRABLE |
Свойство транзакции |
Примечания
Если команда SET TRANSACTION выполняется без предварительной команды START TRANSACTION или BEGIN, выдается предупреждение, и команда не оказывает никакого эффекта.
Можно обойтись без команды SET TRANSACTION, указав вместо этого требуемые режимы транзакций в командах BEGIN или START TRANSACTION.
Режимы транзакций по умолчанию для сессии также можно установить, указав параметры конфигурации default_transaction_isolation, default_transaction_read_only и default_transaction_deferrable.
Примеры
Установка уровня изоляции транзакций для текущей транзакции:
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Совместимость
Обе команды определены в стандарте SQL. SERIALIZABLE — это уровень изоляции транзакций по умолчанию в стандарте. В Greengage DB по умолчанию используется READ COMMITTED. Из-за отсутствия предикатной блокировки Greengage DB не полностью поддерживает уровень SERIALIZABLE, поэтому при указании SERIALIZABLE он переключается на уровень REPEATABLE READ. По сути, система предикатной блокировки предотвращает фантомные чтения, ограничивая то, что записывается, тогда как модель Multi-Version Concurrency Control (MVCC), используемая в Greengage DB, предотвращает их, ограничивая то, что читается.
PostgreSQL предоставляет уровень сериализуемой изоляции снимков (Serializable Snapshot Isolation, SSI), который отслеживает параллельные транзакции и откатывает транзакции, которые могут привести к аномалиям сериализации. Greengage DB не реализует этот режим изоляции.
В стандарте SQL существует еще одна характеристика транзакции, которую можно установить с помощью этих команд — размер области диагностики. Эта концепция специфична для встраиваемого SQL и поэтому не реализована в сервере Greengage DB.
Режим транзакций DEFERRABLE — это расширение языка Greengage DB.
Стандарт SQL требует использования запятых между последовательными transaction_mode, но по историческим причинам Greengage DB позволяет опустить запятые.