Spec-Zone.ru › MySQL 8.4

15.3.7 Заявление SET TRANSACTION

SET [GLOBAL | SESSION] TRANSACTION
    transaction_characteristic [, transaction_characteristic] ...

transaction_characteristic: {
    ISOLATION LEVEL level
  | access_mode
}

level: {
     REPEATABLE READ
   | READ COMMITTED
   | READ UNCOMMITTED
   | SERIALIZABLE
}

access_mode: {
     READ WRITE
   | READ ONLY
}

Это утверждение задаёт характеристики. Оно принимает список одного или нескольких значений характеристик, разделённых запятыми. Каждое значение характеристики устанавливает режим транзакции или доступа. Уровень изоляции используется для операций с таблицами InnoDB. Режим доступа указывает, работают ли транзакции в режиме чтения/записи или только чтения.

Кроме того, SET TRANSACTION может включать необязательное ключевое слово GLOBAL или SESSION для указания области действия заявления.

  • Уровни изоляции транзакций

  • Режим доступа транзакции

  • Область действия характеристики транзакции

Уровни изоляции транзакций

Для установки уровня изоляции транзакции используйте клаузу ISOLATION LEVEL level. Не допускается указывать несколько клаузу ISOLATION LEVEL в одном и том же заявлении SET TRANSACTION.

По умолчанию уровень изоляции — REPEATABLE READ. Другие разрешенные значения — READ COMMITTED, READ UNCOMMITTED и SERIALIZABLE. Сведения об этих уровнях изоляции см. в разделе 17.7.2.1, «Уровни изоляции транзакций».

Режим доступа транзакции

Для установки режима доступа транзакции используйте клаузу READ WRITE или READ ONLY. Не допускается указывать несколько клауз режима доступа в одном и том же заявлении SET TRANSACTION.

По умолчанию транзакция выполняется в режиме чтения/записи, с разрешенным чтением и записью в таблицы, используемые в транзакции. Этот режим может быть явно указан с помощью SET TRANSACTION с режимом доступа READ WRITE.

Если режим доступа транзакции установлен на READ ONLY, изменения в таблицах запрещены. Это может позволить движкам хранения повысить производительность, когда записи не допускаются.

В режиме только чтения остаётся возможность изменять таблицы, созданные с помощью ключевого слова TEMPORARY, с помощью операторов DML. Изменения, внесенные с помощью операторов DDL, не допускаются, так же как и для постоянных таблиц.

Режимы доступа READ WRITE и READ ONLY также могут быть указаны для отдельной транзакции с помощью оператора START TRANSACTION.

Область действия характеристик транзакции

Вы можете задать характеристики транзакции глобально, для текущей сессии или только для следующей транзакции:

  • С помощью ключевого слова GLOBAL:

    • Заявление применяется глобально для всех последующих сессий.

    • Существующие сессии не затрагиваются.

  • С помощью ключевого слова SESSION:

    • Заявление применяется ко всем последующим транзакциям, выполняемым в текущей сессии.

    • Заявление разрешено внутри транзакций, но не влияет на текущую выполняющуюся транзакцию.

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

  • Без ключевых слов SESSION или GLOBAL:

    • Заявление применяется только к следующей единственной транзакции, выполненной в сессии.

    • Последующие транзакции возвращаются к использованию значения сессии заданных характеристик.

    • Заявление не разрешено внутри транзакций:

      mysql> START TRANSACTION;
      Query OK, 0 rows affected (0.02 sec)
      
      mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      ERROR 1568 (25001): Transaction characteristics can't be changed
      while a transaction is in progress
      

Изменение глобальных характеристик транзакции требует привилегия CONNECTION_ADMIN (или устаревшего привилегия SUPER). Любая сессия свободна изменить свои характеристики сессии (даже в середине транзакции) или характеристики своей следующей транзакции (до начала этой транзакции).

Чтобы установить глобальный уровень изоляции при запуске сервера, используйте опцию --transaction-isolation=level в командной строке или в файле параметров. Значения level для этой опции используют дефисы вместо пробелов, поэтому допустимые значения — READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ или SERIALIZABLE.

Аналогично, для установки глобального режима доступа к транзакциям при запуске сервера используйте опцию --transaction-read-only. По умолчанию используется OFF (режим чтения/записи), но значение может быть установлено в ON для режима только чтения.

Например, для установки уровня изоляции на REPEATABLE READ и режима доступа на READ WRITE, используйте эти строки в разделе [mysqld] файла параметров:

[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF

Во время выполнения характеристики на уровнях глобальном, сессионном и для следующей транзакции могут быть заданы косвенно с помощью оператора SET TRANSACTION, как описано ранее. Они также могут быть установлены напрямую с помощью оператора SET для присвоения значений системным переменным transaction_isolation и transaction_read_only:

  • SET TRANSACTION позволяет использовать необязательные ключевые слова GLOBAL и SESSION для установки характеристик транзакции на разных уровнях области действия.

  • Оператор SET для присваивания значений системным переменным transaction_isolation и transaction_read_only имеет синтаксические варианты для установки этих переменных на разных уровнях области действия.

В следующих таблицах показан уровень области действия характеристики, установленной каждым оператором SET TRANSACTION и синтаксисом присваивания переменной.

Таблица 15.9 Синтаксис SET TRANSACTION для характеристик транзакции

Таблица 15.9 Синтаксис SET TRANSACTION для характеристик транзакции
Синтаксис Затронутая область действия характеристики
SET GLOBAL TRANSACTION transaction_characteristic Глобальная
SET SESSION TRANSACTION transaction_characteristic Сессия
SET TRANSACTION transaction_characteristic Только следующая транзакция

Таблица 15.10 Синтаксис SET для характеристик транзакции

Таблица 15.10 Синтаксис SET для характеристик транзакции
Синтаксис Затронутая область действия характеристики
SET GLOBAL var_name = value Глобальная
SET @@GLOBAL.var_name = value Глобальная
SET PERSIST var_name = value Глобальная
SET @@PERSIST.var_name = value Глобальная
SET PERSIST_ONLY var_name = value Без эффекта во время выполнения
SET @@PERSIST_ONLY.var_name = value Без эффекта во время выполнения
SET SESSION var_name = value Сессия
SET @@SESSION.var_name = value Сессия
SET var_name = value Сессия
SET @@var_name = value Только следующая транзакция

Можно проверить глобальные и сессионные значения характеристик транзакции во время выполнения:

SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/set-transaction.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API