Spec-Zone .ru
спецификации, руководства, описания, API
|
START TRANSACTION [transaction_characteristic
[,transaction_characteristic
] ...]transaction_characteristic
: WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLYBEGIN [WORK]COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]SET autocommit = {0 | 1}
Эти операторы обеспечивают управление использованием транзакций:
START TRANSACTION
или BEGIN
запустите новую транзакцию.
COMMIT
фиксирует текущую транзакцию, производя ее
постоянные изменения.
ROLLBACK
откатывает текущую транзакцию, отменяя ее
изменения.
SET autocommit
отключает или включает режиму
автоматической фиксации значения по умолчанию для текущего сеанса.
По умолчанию MySQL работает с включенным режимом автоматической фиксации. Это означает, что, как только Вы выполняете оператор, который обновления (изменяют) таблицу, MySQL хранит обновление о диске, чтобы сделать ее постоянной. Изменение не может откатываться.
Чтобы отключить режим автоматической фиксации неявно для единственной серии операторов, используйте START TRANSACTION
оператор:
START TRANSACTION;SELECT @A:=SUM(salary) FROM table1 WHERE type=1;UPDATE table2 SET summary=@A WHERE type=1;COMMIT;
С START TRANSACTION
, автоматическая фиксация остается отключенной, пока Вы не
заканчиваете транзакцию COMMIT
или ROLLBACK
. Режим
автоматической фиксации тогда возвращается к его предыдущему состоянию.
START TRANSACTION
разрешения несколько модификаторов та контрольная сделка
характеристики. Чтобы определить многократные модификаторы, разделите их запятыми.
WITH CONSISTENT SNAPSHOT
модификатор запускает непротиворечивое
чтение для механизмов хранения, которые способны к нему. Это применяется только к InnoDB
. Эффект является тем же самым как выходящий a START
TRANSACTION
сопровождаемый a SELECT
от любого InnoDB
таблица. См. Раздел
14.2.3.3, "Непротиворечивые Чтения Без блокировки". WITH
CONSISTENT SNAPSHOT
модификатор не изменяет текущий уровень
изоляции транзакции, таким образом, это обеспечивает непротиворечивый снимок, только если
текущий уровень изоляции является тем, который разрешает непротиворечивое чтение (REPEATABLE READ
или SERIALIZABLE
).
READ WRITE
и READ ONLY
набор модификаторов режим доступа транзакции. Они разрешают или запрещают изменения к таблицам,
используемым в транзакции. READ ONLY
ограничение препятствует тому, чтобы
транзакция изменила или заблокировала и транзакционные и нетранзакционные таблицы, которые видимы к
другим транзакциям; транзакция может все еще изменить или заблокировать временные таблицы. Эти
модификаторы доступны с MySQL 5.6.5.
MySQL включает дополнительной оптимизации для запросов на InnoDB
таблицы, когда транзакция, как известно, только для чтения. Определение READ
ONLY
гарантирует, что эта оптимизация применяется в случаях, где состояние только для
чтения не может быть определено автоматически. См. Раздел
14.2.4.2.3, "Оптимизация для Транзакций Только для чтения" для получения
дополнительной информации.
Если никакой режим доступа не определяется, режим по умолчанию применяется. Если значение по
умолчанию не было изменено, это - чтение-запись. Не разрешается определить обоих READ WRITE
и READ ONLY
в том же самом
операторе.
В режиме только для чтения остается возможным изменить таблицы, составленные с TEMPORARY
ключевое слово используя операторы DML. Изменения,
произведенные с операторами DDL, не разрешаются, так же, как с постоянными таблицами.
Для дополнительной информации о режиме доступа транзакции, включая способы изменить режим по
умолчанию, см. Раздел 13.3.6,"SET
TRANSACTION
Синтаксис".
Если read_only
системная переменная включается, явно запуская транзакцию с START TRANSACTION
READ WRITE
требует SUPER
полномочие.
Много API, используемых для того, чтобы записать клиентские приложения MySQL (такие как JDBC),
обеспечивают свои собственные методы для того, чтобы они начали транзакции, которые могут (и иногда должен)
использоваться вместо того, чтобы отправить a START TRANSACTION
оператор от
клиента. См. Главу 22,
Соединители и API, или документацию для Вашего API, для получения дополнительной информации.
Чтобы отключить режим автоматической фиксации явно, используйте следующий оператор:
SET autocommit=0;
После отключения режима автоматической фиксации, устанавливая autocommit
переменная, чтобы обнулить, изменения к безопасным от транзакции
таблицам (таким как те для InnoDB
или NDB
)
не делаются постоянными сразу. Следует использовать COMMIT
сохранить Ваши изменения к диску или ROLLBACK
проигнорировать изменения.
autocommit
переменная сеанса и должна быть установлена для каждого сеанса. Чтобы отключить режим автоматической фиксации
для каждого нового соединения, см. описание autocommit
системная переменная в Разделе
5.1.4, "Системные Переменные Сервера".
BEGIN
и BEGIN WORK
поддерживаются как псевдонимы START TRANSACTION
для того, чтобы инициировать транзакцию. START
TRANSACTION
стандартный синтаксис SQL, рекомендуемый способ запустить оперативную транзакцию, и разрешает
модификаторы это BEGIN
не делает.
BEGIN
оператор отличается от использования BEGIN
ключевое слово, которое запускает a BEGIN ... END
составной оператор. Последний не начинает транзакцию. См. Раздел
13.6.1,"BEGIN ... END
Синтаксис составного оператора".
В пределах всех сохраненных программ (хранимые процедуры и функции, триггеры, и события), обработки
синтаксического анализатора BEGIN [WORK]
как начало a BEGIN ... END
блок. Начните транзакцию в этом контексте с START TRANSACTION
вместо этого.
Дополнительное WORK
ключевое слово поддерживается для COMMIT
и ROLLBACK
, как CHAIN
и RELEASE
пункты. CHAIN
и RELEASE
может использоваться для дополнительного
управления завершением транзакции. Значение completion_type
системная переменная определяет поведение завершения значения
по умолчанию. См. Раздел 5.1.4, "Системные Переменные Сервера".
AND CHAIN
пункт заставляет новую транзакцию начинаться, как только текущий
заканчивается, и у новой транзакции есть тот же самый уровень изоляции как только завершенная транзакция. RELEASE
пункт заставляет сервер разъединять текущий клиентский сеанс после
завершения текущей транзакции. Включая NO
ключевое слово подавляет CHAIN
или RELEASE
завершение, которое может быть
полезным если completion_type
системная переменная устанавливается вызвать завершение объединения в цепочку или выпуска по умолчанию.
Начало транзакции заставляет любую транзакцию на ожидании фиксироваться. См. Раздел 13.3.3, "Операторы Который Причина Неявная Фиксация", для получения дополнительной информации.
Начало транзакции также вызывает блокировки таблицы, полученные с LOCK TABLES
быть выпущенным, как если бы Вы выполнились UNLOCK TABLES
. Начало транзакции не выпускает глобальную блокировку чтения,
полученную с FLUSH
TABLES WITH READ LOCK
.
Для лучших результатов транзакции должны быть выполнены, используя только таблицы, которыми управляет единственный безопасный от транзакции механизм хранения. Иначе, следующие проблемы могут произойти:
Если Вы используете таблицы больше чем от одного безопасного от транзакции
механизма хранения (такой как InnoDB
), и уровень изоляции транзакции не SERIALIZABLE
, возможно, что, когда одна транзакция фиксирует, другая
продолжающаяся транзакция, которая использует те же самые таблицы, будет видеть только некоторые из
изменений, произведенных первой транзакцией. Таким образом, атомарность транзакций не гарантируется со
смешанными механизмами, и несогласованности могут закончиться. (Если транзакции смешанного механизма
являются нечастыми, можно использовать SET
TRANSACTION ISOLATION LEVEL
установить уровень изоляции в SERIALIZABLE
на основе на транзакцию по мере необходимости.)
Если Вы используете таблицы, которые не безопасны от транзакции в пределах транзакции, изменения к тем таблицам сохранены сразу, независимо от состояния режима автоматической фиксации.
Если Вы проблема a ROLLBACK
оператор после обновления нетранзакционной таблицы в пределах
транзакции, ER_WARNING_NOT_COMPLETE_ROLLBACK
предупреждение происходит. Изменения
к безопасным от транзакции таблицам откатываются, но не изменяется на безопасные от нетранзакции
таблицы.
Каждая транзакция сохранена в двоичном файле, входят в систему один блок, на COMMIT
. Транзакции, которые откатываются, не регистрируются. (Исключение:
Модификации к нетранзакционным таблицам не могут откатываться. Если транзакция, которая откатывается, включает
модификации в нетранзакционные таблицы, вся транзакция регистрируется с a ROLLBACK
оператор в конце, чтобы гарантировать, что модификации к
нетранзакционным таблицам тиражируются.) См. Раздел 5.2.4, "Двоичный
Журнал".
Можно изменить уровень изоляции или режим доступа для транзакций с SET TRANSACTION
оператор. См. Раздел
13.3.6,"SET TRANSACTION
Синтаксис".
Откат может быть медленной работой, которая может произойти неявно без пользователя, явно просившего его
(например, когда ошибка происходит). Из-за этого, SHOW PROCESSLIST
дисплеи Rolling back
в State
столбец для сеанса, не только для явных откатов, выполняемых с ROLLBACK
оператор, но также и для неявных откатов.
В MySQL 5.6, BEGIN
, COMMIT
, и ROLLBACK
не влияют --replicate-do-db
или --replicate-ignore-db
правила.