Spec-Zone.ru › MariaDB

НАЧАТЬ ТРАНЗАКЦИЮ

Синтаксис

START TRANSACTION [transaction_property [, transaction_property] ...] | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}

transaction_property:
    WITH CONSISTENT SNAPSHOT
  | READ WRITE
  | READ ONLY

Описание

Команда START TRANSACTION или BEGIN начинает новую транзакцию. COMMIT подтверждает текущую транзакцию, делая ее изменения постоянными. ROLLBACK откатывает текущую транзакцию, отменяя ее изменения. Команда SET autocommit отключает или включает режим автоподтверждения по умолчанию для текущей сессии.

START TRANSACTION и SET autocommit = 1 неявно подтверждают текущую транзакцию, если она есть.

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

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

Режим доступа

Режим доступа определяет, разрешено ли транзакции записывать данные. По умолчанию транзакции находятся в режиме READ WRITE (см. системную переменную tx_read_only). Режим READ ONLY позволяет хранилищу данных применять оптимизации, которые не могут быть использованы для транзакций, записывающих данные. Обратите внимание, что в отличие от глобального режима read_only, привилегия READ_ONLY ADMIN (и SUPER до версии MariaDB 10.11.0) не разрешает запись, а также не разрешены операторы DDL над временными таблицами.

Не разрешается указывать и READ WRITE, и READ ONLY в одном операторе.

READ WRITE и READ ONLY также могут быть указаны в операторе SET TRANSACTION, в этом случае указанный режим действует для всех сессий или для всех последующих транзакций, используемых текущей сессией.

autocommit

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

SET autocommit=0;

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

Для отключения режима автоподтверждения для одной серии операторов используйте оператор START TRANSACTION.

Операторы DDL

Операторы DDL (CREATE, ALTER, DROP) и административные операторы (FLUSH, RESET, OPTIMIZE, ANALYZE, CHECK, REPAIR, CACHE INDEX), операторы управления транзакциями (BEGIN, START TRANSACTION) и LOAD DATA INFILE вызывают неявное COMMIT и начинают новую транзакцию. Исключением из этого правила являются операторы DDL, работающие над временными таблицами: вы можете CREATE, ALTER и DROP их без вызова каких-либо COMMIT, но эти действия не могут быть отменены. Это означает, что если вы вызовете ROLLBACK, временные таблицы, созданные в транзакции, останутся, в то время как остальная часть транзакции будет отменена.

Транзакции не могут быть использованы в хранимых функциях или триггерах. В хранимых процедурах и событиях BEGIN запрещен, поэтому вместо него следует использовать START TRANSACTION.

Транзакция приобретает блокировку метаданных на каждой таблице, к которой она обращается, чтобы предотвратить изменение их структуры другими подключениями. Блокировка освобождается в конце транзакции. Это происходит даже с нетранзакционными хранилищами данных (например, MEMORY или CONNECT), поэтому имеет смысл использовать транзакции с нетранзакционными таблицами.

in_transaction

Системная переменная in_transaction — это сессионная, только для чтения переменная, которая возвращает 1 внутри транзакции и 0 если транзакция не активна.

С ПОСТОЯННОЙ СНИМКОЙ

Опция WITH CONSISTENT SNAPSHOT запускает согласованное чтение для хранилищ данных, таких как InnoDB, которые могут это делать, так же, как если бы были вызваны START TRANSACTION, за которым следует SELECT из любой таблицы InnoDB.

См. Улучшения для START TRANSACTION WITH CONSISTENT SNAPSHOT.

Примеры

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

См. также

  • Улучшения для START TRANSACTION WITH CONSISTENT SNAPSHOT
  • MyRocks и START TRANSACTION WITH CONSISTENT SNAPSHOT
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в данном содержании, не обязательно отражают взгляды MariaDB или любой другой стороны.

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/start-transaction/

Spec-Zone.ru

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