Spec-Zone.ru › MySQL 5.7

13.3.6 Оператор 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. Сведения об этих уровнях изоляции см. в разделе 14.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
      

Для изменения глобальных характеристик транзакций требуется привилегия 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 и синтаксисом присваивания переменных.

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

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

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

Таблица 13.7 Синтаксис SET для характеристик транзакции
Синтаксис Затронутая область действия характеристик
SET GLOBAL var_name = value Глобальная
SET @@GLOBAL.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;

До MySQL 5.7.20 используйте tx_isolation и tx_read_only вместо transaction_isolation и transaction_read_only.

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

Spec-Zone.ru

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