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.
© 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/