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}

Описание

Команда SET TRANSACTION устанавливает характеристики текущей транзакции. Она не оказывает влияния на последующие транзакции.

Доступные характеристики транзакции включают уровень изоляции транзакции, режим доступа к транзакции (чтение/запись или только чтение) и откладываемые режимы.

Примечание: Откладываемая транзакция требует, чтобы транзакция была сериализуемой. База данных YMatrix не поддерживает сериализуемые транзакции, поэтому использование параметра DEFERRABLE является недопустимым. База данных YMatrix не поддерживает команду SET TRANSACTION SNAPSHOT.

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

  • READ COMMITTED — оператор может видеть только строки, зафиксированные до его запуска. Это значение по умолчанию.
  • REPEATABLE READ — все операторы в текущей транзакции могут видеть только строки, зафиксированные до начала выполнения первого запроса в транзакции, либо изменённые операторами модификации данных внутри этой транзакции.

Стандарт SQL определяет два дополнительных уровня — READ UNCOMMITTED и SERIALIZABLE. В базе данных YMatrix уровень READ UNCOMMITTED интерпретируется как READ COMMITTED. Если указано SERIALIZABLE, база данных YMatrix автоматически переключается на 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. Когда все эти свойства установлены для транзакции, она может ожидать при получении снимка, после чего может выполняться без обычных накладных расходов сериализуемых транзакций и без риска возникновения ошибки сериализации или отмены из-за такой ошибки. Поскольку база данных YMatrix не поддерживает сериализуемые транзакции, атрибут DEFERRABLE недействителен в YMatrix.

Параметры

SESSION CHARACTERISTICS

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

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

  • Стандарт SQL определяет четыре уровня изоляции транзакций: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ и SERIALIZABLE.
  • READ UNCOMMITTED позволяет транзакциям просматривать изменения, сделанные параллельными незафиксированными транзакциями. В базе данных YMatrix это невозможно, поэтому READ UNCOMMITTED эквивалентен READ COMMITTED.
  • READ COMMITTED — уровень изоляции по умолчанию в базе данных YMatrix, гарантирующий, что операторы могут видеть только строки, зафиксированные до их начала. Если другая параллельная транзакция будет зафиксирована после первого выполнения оператора, один и тот же оператор, выполненный дважды в одной транзакции, может дать разные результаты.
  • Уровень изоляции REPEATABLE READ гарантирует, что транзакции могут видеть только строки, зафиксированные до начала транзакции. REPEATABLE READ — самый строгий уровень изоляции, поддерживаемый базами данных YMatrix. Из-за возможного отказа сериализации приложения, использующие уровень изоляции REPEATABLE READ, должны быть готовы повторно выполнять транзакцию.
  • Уровень изоляции SERIALIZABLE гарантирует, что все операторы текущей транзакции могут видеть только строки, зафиксированные до начала выполнения первого запроса в этой транзакции или изменённые операторами модификации данных внутри этой транзакции. Если взаимодействие между параллельными сериализуемыми транзакциями приведёт к тому, что любое последовательное (поочерёдное) выполнение таких транзакций станет невозможным, одна из транзакций будет откатана с ошибкой serialization_failure. База данных YMatrix не полностью поддерживает стандартный уровень SERIALIZABLE, поэтому при указании SERIALIZABLE происходит переход на уровень REPEATABLE READ.

READ WRITE

READ ONLY

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

[NOT] DEFERRABLE

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

Примечание

Если 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 — уровень изоляции по умолчанию в стандарте. В базе данных YMatrix значением по умолчанию является READ COMMITTED. База данных YMatrix не полностью поддерживает уровень SERIALIZABLE из-за отсутствия предикатной блокировки, поэтому при указании SERIALIZABLE происходит переход на уровень REPEATABLE READ. По сути, система предикатной блокировки предотвращает фантомное чтение, ограничивая то, что может быть записано, тогда как модель многоверсионного управления конкурентным доступом (MVCC), используемая в базе данных YMatrix, предотвращает фантомное чтение, ограничивая то, что может быть прочитано.

PostgreSQL предоставляет истинный уровень сериализуемой изоляции, называемый изоляцией сериализуемого снимка (Serializable Snapshot Isolation, SSI), которая отслеживает параллельные транзакции и откатывает те, которые могут вызвать исключения сериализации. Этот режим изоляции не реализован в базе данных YMatrix.

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

Режим DEFERRABLE является расширением языка базы данных YMatrix.

Смотрите также

BEGIN, LOCK