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
. Не разрешается указывать несколько клауз levelISOLATION 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= в командной строке или в файле опций. Значения levellevel для этой опции используют дефисы вместо пробелов, поэтому допустимыми значениями являются 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 для характеристик транзакции
| Синтаксис | Затронутая область действия характеристик |
|---|---|
SET GLOBAL TRANSACTION
| Глобальная |
SET SESSION TRANSACTION
| Сессия |
SET TRANSACTION
| Только следующая транзакция |
Таблица 13.7 Синтаксис SET для характеристик транзакции
| Синтаксис | Затронутая область действия характеристик |
|---|---|
SET GLOBAL | Глобальная |
SET @@GLOBAL. | Глобальная |
SET SESSION | Сессия |
SET @@SESSION. | Сессия |
SET | Сессия |
SET @@ | Только следующая транзакция |
Можно проверить глобальные и сессионные значения характеристик транзакций во время выполнения:
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.