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
. Не допускается указывать несколько клаузу levelISOLATION 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= в командной строке или в файле параметров. Значения 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 и синтаксисом присваивания переменной.
Таблица 15.9 Синтаксис SET TRANSACTION для характеристик транзакции
| Синтаксис | Затронутая область действия характеристики |
|---|---|
SET GLOBAL TRANSACTION
| Глобальная |
SET SESSION TRANSACTION
| Сессия |
SET TRANSACTION
| Только следующая транзакция |
Таблица 15.10 Синтаксис SET для характеристик транзакции
| Синтаксис | Затронутая область действия характеристики |
|---|---|
SET GLOBAL | Глобальная |
SET @@GLOBAL. | Глобальная |
SET PERSIST | Глобальная |
SET @@PERSIST. | Глобальная |
SET PERSIST_ONLY | Без эффекта во время выполнения |
SET @@PERSIST_ONLY. | Без эффекта во время выполнения |
SET SESSION | Сессия |
SET @@SESSION. | Сессия |
SET | Сессия |
SET @@ | Только следующая транзакция |
Можно проверить глобальные и сессионные значения характеристик транзакции во время выполнения:
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
© 2025 Oracle
Licensed under the GPLv2 License.