Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

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

Позволяет выполнить новую транзакцию с тем же снимком данных, который имеет уже существующая транзакция. Идентификатор существующей транзакции передается в команду SET TRANSACTION SNAPSHOT. Для получения идентификатора существующей транзакции необходимо сначала вызвать функцию pg_export_snapshot

SESSION CHARACTERISTICS

Устанавливает характеристики транзакций по умолчанию для последующих транзакций в рамках одной сессии

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

Стандарт SQL определяет четыре уровня изоляции транзакций: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE.

READ UNCOMMITTED позволяет транзакциям видеть изменения, внесенные незафиксированными параллельными транзакциями. В Greengage DB это невозможно, поэтому READ UNCOMMITTED обрабатывается так же, как READ COMMITTED.

READ COMMITTED, уровень изоляции по умолчанию в Greengage DB, гарантирует, что оператор может видеть только те строки, которые были зафиксированы до его начала. Одно и то же выполнение оператора дважды в рамках одной транзакции может привести к разным результатам, если другая параллельная транзакция будет зафиксирована после первого выполнения оператора.

Уровень изоляции REPEATABLE READ гарантирует, что транзакция может видеть только строки, зафиксированные до ее начала. REPEATABLE READ — это самый строгий уровень изоляции транзакций, поддерживаемый Greengage DB. Приложения, использующие уровень изоляции REPEATABLE READ, должны быть готовы к повторению транзакций из-за сбоев сериализации.

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

READ WRITE

READ ONLY

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

[NOT] DEFERRABLE

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

Примечания

Если команда 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 позволяет опустить запятые.

См. также