Spec-Zone .ru
спецификации, руководства, описания, API
|
SET [GLOBAL | SESSION] TRANSACTIONtransaction_characteristic
[,transaction_characteristic
] ...transaction_characteristic
: ISOLATION LEVELlevel
| READ WRITE | READ ONLYlevel
: REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE
Этот оператор определяет характеристики транзакции. Это берет список одного или более
характеристических значений, разделенных запятыми. Эти характеристики набор уровень
изоляции транзакции или режим доступа. Уровень изоляции используется для операций на InnoDB
таблицы. Режим доступа может быть определен относительно того,
работают ли транзакции в чтении-записи или режиме только для чтения.
Кроме того, SET TRANSACTION
может включать дополнительное GLOBAL
или SESSION
ключевое слово, чтобы указать на контекст оператора.
Можно установить характеристики транзакции глобально для текущего сеанса, или для следующей транзакции:
С GLOBAL
ключевое слово, оператор применяется
глобально для всех последующих сеансов. Существующие сеансы незатронуты.
С SESSION
ключевое слово, оператор применяется ко всем
последующим транзакциям, выполняемым в пределах текущего сеанса.
Ни с кем SESSION
или GLOBAL
ключевое слово, оператор применяется к следующему (не, запускался),
транзакция, выполняемая в пределах текущего сеанса.
Глобальное изменение к характеристикам транзакции требует 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=
опция к mysqld на командной строке или в файле опции. Значения level
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 поддерживает различные уровни транзакции. Список идет от обычно используемого уровня до наименее используемого.
Это - уровень изоляции значения по умолчанию для InnoDB
. Для непротиворечивых
чтений есть важное различие от READ COMMITTED
уровень изоляции: Все непротиворечивые чтения в
пределах того же самого чтения транзакции снимок устанавливаются первым чтением. Это соглашение
означает это, если Вы выпускаете несколько плоскостей (без блокировки) SELECT
операторы в пределах той же самой транзакции, их SELECT
операторы являются непротиворечивыми также друг
относительно друга. См. Раздел 14.2.3.3, "Непротиворечивые
Чтения Без блокировки".
Для того, чтобы заблокировать
чтения (SELECT
с FOR UPDATE
или LOCK IN SHARE MODE
), UPDATE
, и DELETE
операторы, блокировка зависит от того, использует ли оператор уникальный индекс с уникальным
условием поиска, или условием поиска типа диапазона. Для уникального индекса с уникальным условием
поиска, InnoDB
блокировки только индексировать найденная запись, не разрыв перед этим. Для других
условий поиска, InnoDB
блокировки индексировать диапазон
отсканированные, использующие блокировки
разрыва или следующие
блокировки ключа, чтобы блокировать вставки другими сеансами в разрывы, покрытые диапазоном.
Несколько Подобный Oracle уровень изоляции относительно непротиворечивых чтений (без блокировки): Каждое непротиворечивое чтение, даже в пределах той же самой транзакции, устанавливает и читает свой собственный новый снимок. См. Раздел 14.2.3.3, "Непротиворечивые Чтения Без блокировки".
Для того, чтобы заблокировать
чтения (SELECT
с FOR UPDATE
или LOCK IN SHARE MODE
), UPDATE
операторы, и DELETE
операторы, InnoDB
блокировки
только индексируют записи, не разрывы
перед ними, и таким образом разрешает свободную вставку новых записей рядом с заблокированными
записями.
В MySQL 5.7, когда READ COMMITTED
уровень изоляции
используется, или осуждаемый innodb_locks_unsafe_for_binlog
системная переменная
включается, есть нет InnoDB
блокировка разрыва за исключением
ограничительной проверки внешнего ключа и двойной ключевой проверки. Кроме того, блокировки
записи для того, чтобы несоответствовать строки выпускаются после того, как MySQL оценил WHERE
условие.
Если Вы используете READ COMMITTED
или включите innodb_locks_unsafe_for_binlog
, следует
использовать основанное на строке двоичное журналирование.
SELECT
операторы выполняются способом без блокировки, но возможная более ранняя версия строки могла бы
использоваться. Таким образом, используя этот уровень изоляции, такие чтения не являются
непротиворечивыми. Это также вызывают грязным чтением. Иначе, этот уровень
изоляции работает как READ COMMITTED
.
Этот уровень походит REPEATABLE READ
, но InnoDB
неявно
преобразовывает всю плоскость SELECT
операторы к SELECT ... LOCK IN SHARE MODE
если автоматическая фиксация
отключается. Если автоматическая фиксация включается, SELECT
его собственная транзакция. Это поэтому, как известно,
только для чтения и может быть сериализировано если выполняющийся как непротиворечивое чтение (без
блокировки) и не должно блокировать для других транзакций. (Чтобы вызвать плоскость SELECT
чтобы блокировать, если другие транзакции изменили
выбранные строки, отключите автоматическую фиксацию.)
Режим доступа транзакции может быть определен с SET
TRANSACTION
. По умолчанию транзакция имеет место в режиме чтения-записи, и с чтениями и с записями,
разрешенными к таблицам, используемым в транзакции. Этот режим может быть определен, явно используя режим
доступа READ WRITE
.
Если режим доступа транзакции устанавливается в READ ONLY
, изменения к таблицам
запрещаются. Это может позволить механизмам хранения сделать улучшения производительности, которые возможны,
когда записи не разрешаются.
Не разрешается определить обоих READ WRITE
и READ ONLY
в том же самом операторе.
В режиме только для чтения остается возможным изменить таблицы, составленные с TEMPORARY
ключевое слово используя операторы DML. Изменения, произведенные с
операторами DDL, не разрешаются, так же, как с постоянными таблицами.
READ WRITE
и READ ONLY
режимы доступа также могут быть
определены для отдельной транзакции, используя START TRANSACTION
оператор.