Ответ
Некоторые операции несовместимы с логикой транзакций или неявно завершают текущую транзакцию. Это зависит от СУБД, но общие правила таковы:
1. Операции DDL (Data Definition Language)
Большинство СУБД (Oracle, PostgreSQL, SQL Server) автоматически выполняют коммит до и после DDL-операции, прерывая активную транзакцию.
BEGIN TRANSACTION; -- Начало транзакции в PostgreSQL
INSERT INTO users (name) VALUES ('Alice'); -- Входит в транзакцию
CREATE TABLE temp_log (id SERIAL); -- НЕЯВНЫЙ КОММИТ! Транзакция завершена.
INSERT INTO users (name) VALUES ('Bob'); -- Выполнится ВНЕ транзакции
ROLLBACK; -- Не откатит вставку 'Alice' (уже закоммичена) или 'Bob' (вне транзакции).
2. Операции управления соединением и транзакцией
COMMIT,ROLLBACK— явно завершают транзакцию.SET AUTOCOMMIT = 1(илиON) — переключение режима.SET TRANSACTION ISOLATION LEVEL— в некоторых СУБД может требовать выполнения вне транзакции.
3. Некоторые административные операции
CREATE DATABASE,DROP DATABASE,ALTER DATABASE.- Резервное копирование/восстановление (
BACKUP,RESTORE).
4. Особенности СУБД
- MySQL (InnoDB): DDL-операции являются транзакционными и могут быть откатаны в рамках текущей транзакции.
- SQLite: Большинство DDL-операций также транзакционны.
Практическое правило: Избегайте смешивания DML (SELECT, INSERT, UPDATE, DELETE) и DDL в одной логической транзакции. Если DDL необходим, выполняйте его в отдельном соединении или явно завершайте текущую транзакцию перед ним.