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.