Spec-Zone .ru
спецификации, руководства, описания, API

13.3.6. SET TRANSACTION Синтаксис

SET [GLOBAL | SESSION] TRANSACTION    transaction_characteristic [, transaction_characteristic] ...transaction_characteristic:    ISOLATION LEVEL level  | READ WRITE  | READ ONLYlevel:     REPEATABLE READ   | READ COMMITTED   | READ UNCOMMITTED   | SERIALIZABLE

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

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

Контекст Характеристик Транзакции

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

Глобальное изменение к характеристикам транзакции требует SUPER полномочие. Любой сеанс свободен изменить свои характеристики сеанса (даже в середине транзакции), или характеристики для ее следующей транзакции.

SET TRANSACTION без GLOBAL или SESSION не разрешается, в то время как есть активная транзакция:

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 changedwhile a transaction is in progress

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

[mysqld]transaction-isolation = REPEATABLE-READ

Возможно проверить или установить глобальную переменную и уровни изоляции транзакции сеанса во времени выполнения при использовании tx_isolation системная переменная:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation;SET GLOBAL tx_isolation='REPEATABLE-READ';SET SESSION tx_isolation='SERIALIZABLE';

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

Установка глобальной переменной или значения сеанса tx_isolation или tx_read_only эквивалентно установке уровня изоляции или режима доступа с SET GLOBAL TRANSACTION или SET SESSION TRANSACTION.

Детали и Использование Уровней изоляции

InnoDB поддерживает каждый из уровней изоляции транзакции, описанных, здесь используя различные стратегии блокировки. Можно осуществить высокую степень непротиворечивости со значением по умолчанию REPEATABLE READ уровень, для операций на решающих данных, где соответствие ACID важно. Или можно ослабить правила непротиворечивости с READ COMMITTED или даже READ UNCOMMITTED, в ситуациях, таких как объем, сообщающий, где точная непротиворечивость и повторимые результаты менее важны чем уменьшение количества издержек для того, чтобы заблокировать. SERIALIZABLE осуществляет еще более строгие правила чем REPEATABLE READ, и используется, главным образом, в специализированных ситуациях, такой как с транзакциями XA и для того, чтобы диагностировать проблемы с параллелизмом и мертвыми блокировками.

Для полной информации о том, как эти уровни изоляции работают с InnoDB транзакции, см. Раздел 14.2.3.1," InnoDB Модель транзакции и Блокировка". В частности для дополнительной информации о InnoDB блокировки на уровне записи и как это использует их, чтобы выполнить различные типы операторов, см. Раздел 14.2.3.5,"InnoDB Запись, Разрыв, и Следующие блокировки ключа" и Раздел 14.2.3.7, "Набор блокировок Различными SQL-операторами в InnoDB".

Следующий список описывает, как MySQL поддерживает различные уровни транзакции. Список идет от обычно используемого уровня до наименее используемого.

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

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

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

Не разрешается определить обоих READ WRITE и READ ONLY в том же самом операторе.

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

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