Spec-Zone.ru › MySQL 9.2

15.3.1 Операторы START TRANSACTION, COMMIT и ROLLBACK

START TRANSACTION
    [transaction_characteristic [, transaction_characteristic] ...]

transaction_characteristic: {
    WITH CONSISTENT SNAPSHOT
  | READ WRITE
  | READ ONLY
}

BEGIN [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 работает с включенным режимом автоматического подтверждения. Это означает, что при отсутствии транзакции каждый оператор выполняется атомарно, как если бы он был окружен операторами START TRANSACTION и COMMIT. Вы не можете использовать ROLLBACK для отмены эффекта; однако, если во время выполнения оператора возникнет ошибка, оператор будет отменен.

Чтобы отключить режим автоматического подтверждения неявно для одной серии операторов, используйте оператор 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. Эффект эквивалентен выполнению START TRANSACTION, после чего идёт SELECT из любой таблицы InnoDB. См. Раздел 17.7.2.3, «Согласованные непротиворечивые чтения». Модификатор WITH CONSISTENT SNAPSHOT не изменяет текущую транзакцию, поэтому он предоставляет согласованную моментальную фотографию только в том случае, если текущий уровень изоляции допускает согласованное чтение. Единственный уровень изоляции, который допускает согласованное чтение, — REPEATABLE READ. Для всех других уровней изоляции ключевое слово WITH CONSISTENT SNAPSHOT игнорируется. При игнорировании ключевого слова WITH CONSISTENT SNAPSHOT генерируется предупреждение.

  • Модификаторы READ WRITE и READ ONLY устанавливают режим доступа к транзакции. Они позволяют или запрещают изменения в таблицах, используемых в транзакции. Ограничение READ ONLY предотвращает изменение или блокировку как транзакционных, так и не транзакционных таблиц, видимых другим транзакциям; транзакция всё ещё может изменять или блокировать временные таблицы.

    MySQL включает дополнительные оптимизации для запросов к InnoDB таблицам, когда известно, что транзакция является только для чтения. Указание READ ONLY гарантирует, что эти оптимизации будут применяться в случаях, когда статус только для чтения не может быть определен автоматически. Дополнительную информацию см. в разделе 10.5.3, «Оптимизация транзакций InnoDB только для чтения».

    Если режим доступа не указан, применяется режим по умолчанию. Если не было изменено, то это режим чтения/записи. Не разрешается указывать одновременно READ WRITE и READ ONLY в одном операторе.

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

    Дополнительную информацию о режиме доступа к транзакции, включая способы изменения режима по умолчанию, см. в разделе 15.3.7, «Оператор SET TRANSACTION».

    Если системная переменная read_only включена, явное начало транзакции с помощью START TRANSACTION READ WRITE требует привилегии CONNECTION_ADMIN (или устаревшей привилегии SUPER).

Важно

Многие API, используемые для написания клиентских приложений MySQL (например, JDBC), предоставляют собственные методы для запуска транзакций, которые можно (и иногда следует) использовать вместо отправки оператора START TRANSACTION с клиента. Дополнительную информацию см. в главе 31, Коннекторы и API, или в документации к вашему API.

Для явного отключения режима автоматического подтверждения используйте следующий оператор:

SET autocommit=0;

После отключения режима автоматического подтверждения путём установки переменной autocommit в ноль, изменения в таблицах, поддерживающих транзакции (например, в таблицах для InnoDB или NDB) не сохраняются сразу на диск. Для сохранения изменений на диск необходимо использовать оператор COMMIT, или ROLLBACK для отмены изменений.

autocommit — это переменная сессии и её необходимо устанавливать для каждой сессии. Для отключения режима автоматического подтверждения для каждого нового подключения см. описание системной переменной autocommit в разделе 7.1.8, «Системные переменные сервера».

BEGIN и BEGIN WORK поддерживаются как псевдонимы для оператора START TRANSACTION для начала транзакции. START TRANSACTION — это стандартный синтаксис SQL, рекомендуемый способ запуска транзакции по требованию, и он допускает модификаторы, которых нет в BEGIN.

Оператор BEGIN отличается от использования ключевого слова BEGIN, которое запускает BEGIN ... END составной оператор. Последний не запускает транзакцию. См. раздел 15.6.1, «Составной оператор BEGIN ... END».

Примечание

Во всех хранимых программах (хранимых процедурах и функциях, триггерах и событиях) анализатор рассматривает BEGIN [WORK] как начало блока BEGIN ... END. Начните транзакцию в этом контексте с оператора START TRANSACTION вместо этого.

Необязательное ключевое слово WORK поддерживается для COMMIT и ROLLBACK, а также ключевые слова CHAIN и RELEASE. CHAIN и RELEASE могут использоваться для дополнительного управления завершением транзакции. Значение системной переменной completion_type определяет поведение завершения по умолчанию. См. раздел 7.1.8, «Системные переменные сервера».

Ключевое слово AND CHAIN приводит к началу новой транзакции сразу после завершения текущей, и новая транзакция имеет тот же уровень изоляции, что и завершенная. Новая транзакция также использует тот же режим доступа (READ WRITE или READ ONLY), что и завершенная. Ключевое слово RELEASE заставляет сервер отключить текущую сессию клиента после завершения текущей транзакции. Включение ключевого слова NO подавляет завершение CHAIN или RELEASE, что может быть полезно, если системная переменная completion_type настроена на цепочечное или освобождающее завершение по умолчанию.

Начало транзакции приводит к подтверждению любой ожидающей транзакции. Дополнительную информацию см. в разделе 15.3.3, «Операторы, вызывающие неявное подтверждение».

Начало транзакции также приводит к освобождению блокировок таблиц, полученных с помощью оператора LOCK TABLES, как если бы вы выполнили оператор UNLOCK TABLES. Начало транзакции не освобождает глобальную блокировку чтения, полученную с помощью FLUSH TABLES WITH READ LOCK.

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

  • Если вы используете таблицы из более чем одного транзакционно-безопасного движка хранения (например, InnoDB), и уровень изоляции транзакции не равен SERIALIZABLE, то возможно, что при завершении одной транзакции другая текущая транзакция, использующая те же таблицы, увидит только некоторые изменения, внесённые первой транзакцией. То есть, атомарность транзакций не гарантируется при смешанных движках, и могут возникнуть несоответствия. (Если транзакции со смешанными движками встречаются редко, можно использовать SET TRANSACTION ISOLATION LEVEL для установки уровня изоляции на SERIALIZABLE на основе каждой транзакции по мере необходимости.)

  • Если вы используете таблицы, которые не являются транзакционно-безопасными в рамках транзакции, изменения в этих таблицах сохраняются сразу, независимо от состояния режима автокоммита.

  • Если вы выполняете оператор ROLLBACK после обновления не транзакционной таблицы в рамках транзакции, возникает предупреждение. Изменения в транзакционно-безопасных таблицах отменяются, но не изменения в не транзакционно-безопасных таблицах.

Каждая транзакция хранится в двоичном журнале в одном блоке, при COMMIT. Транзакции, которые отменены, не регистрируются. (Исключение: Изменения в не транзакционных таблицах не могут быть отменены. Если транзакция, которая отменена, включает изменения в не транзакционных таблицах, вся транзакция регистрируется с оператором ROLLBACK в конце, чтобы гарантировать репликацию изменений в не транзакционных таблицах.) См. Раздел 7.4.4, «Двоичный журнал».

Вы можете изменить уровень изоляции или режим доступа для транзакций с помощью оператора SET TRANSACTION. См. Раздел 15.3.7, «Оператор SET TRANSACTION».

Отмена может быть медленной операцией, которая может произойти неявно без явного запроса пользователя (например, при возникновении ошибки). Из-за этого SHOW PROCESSLIST отображает Rolling back в столбце State для сеанса, не только для явных отмен, выполненных с помощью оператора ROLLBACK, но и для неявных отмен.

Примечание

В MySQL 9.2, BEGIN, COMMIT, и ROLLBACK не зависят от правил --replicate-do-db или --replicate-ignore-db.

Когда InnoDB выполняет полную отмену транзакции, все блокировки, установленные транзакцией, освобождаются. Если отдельный оператор SQL в рамках транзакции отменяется в результате ошибки, например, ошибки дублирования ключа, блокировки, установленные оператором, сохраняются, а транзакция остаётся активной. Это происходит потому, что InnoDB хранит блокировки строк в формате, при котором он не может узнать впоследствии, какая блокировка была установлена каким оператором.

Если оператор SELECT в рамках транзакции вызывает хранимую функцию, и оператор внутри хранимой функции терпит неудачу, этот оператор отменяется. Если ROLLBACK выполняется для транзакции впоследствии, вся транзакция отменяется.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/commit.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API