Spec-Zone.ru › MariaDB

SQL-выражения, вызывающие неявную фиксацию

Некоторые SQL-выражения вызывают неявную фиксацию. Как правило, такие выражения являются операторами DDL. Те же самые операторы (кроме SHUTDOWN) порождают ошибку 1400 (SQLSTATE 'XAE09'), если активна XA-транзакция.

Вот список:

ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME
ALTER EVENT
ALTER FUNCTION
ALTER PROCEDURE
ALTER SEQUENCE
ALTER SERVER
ALTER TABLE
ALTER VIEW
ANALYZE TABLE
BEGIN
CACHE INDEX
CHANGE MASTER TO
CHECK TABLE
CREATE DATABASE
CREATE EVENT
CREATE FUNCTION
CREATE INDEX
CREATE PROCEDURE
CREATE ROLE
CREATE SEQUENCE
CREATE SERVER
CREATE TABLE
CREATE TRIGGER
CREATE USER
CREATE VIEW
DROP DATABASE
DROP EVENT
DROP FUNCTION
DROP INDEX
DROP PROCEDURE
DROP ROLE
DROP SEQUENCE
DROP SERVER
DROP TABLE
DROP TRIGGER
DROP USER
DROP VIEW
FLUSH
GRANT
LOAD INDEX INTO CACHE
LOCK TABLES
OPTIMIZE TABLE
RENAME TABLE
RENAME USER
REPAIR TABLE
RESET
REVOKE
SET PASSWORD
SHUTDOWN
START SLAVE
START TRANSACTION
STOP SLAVE
TRUNCATE TABLE

SET autocommit = 1 вызывает неявную фиксацию, если значение было 0.

Все эти выражения вызывают неявную фиксацию перед выполнением. Это означает, что даже если выражение завершается ошибкой, транзакция фиксируется. Некоторые из них, например, CREATE TABLE ... SELECT, также вызывают фиксацию сразу после выполнения. Такие выражения нельзя откатить в любом случае.

Если вы не уверены, вызвало ли выражение неявную фиксацию текущей транзакции, можно запросить системную переменную сервера in_transaction.

Обратите внимание, что при запуске транзакции (не в режиме автофиксирования) все блокировки, полученные с помощью LOCK TABLES, освобождаются. И получение таких блокировок всегда фиксирует текущую транзакцию. Для сохранения целостности данных между транзакционными и нетранзакционными таблицами можно использовать функцию GET_LOCK().

Исключения

Эти выражения не вызывают неявную фиксацию в следующих случаях:

  • CREATE TABLE и DROP TABLE, когда используется ключевое слово TEMPORARY.
    • Однако, TRUNCATE TABLE вызывает неявную фиксацию даже при использовании на временной таблице.
  • CREATE FUNCTION и DROP FUNCTION, когда используются для создания UDF (вместо хранимой функции). Однако, CREATE INDEX и DROP INDEX вызывают фиксацию даже при использовании с временными таблицами.
  • UNLOCK TABLES вызывает фиксацию только в том случае, если использовался LOCK TABLES для нетранзакционных таблиц.
  • START SLAVE, STOP SLAVE, RESET SLAVE и CHANGE MASTER TO вызывают неявную фиксацию только начиная с MariaDB 10.0.
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проходит предварительной проверки 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/sql-statements-that-cause-an-implicit-commit/

Spec-Zone.ru

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