Какие операции в SQL/СУБД обычно нельзя выполнять внутри транзакции?

«Какие операции в SQL/СУБД обычно нельзя выполнять внутри транзакции?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Некоторые операции несовместимы с логикой транзакций или неявно завершают текущую транзакцию. Это зависит от СУБД, но общие правила таковы:

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 необходим, выполняйте его в отдельном соединении или явно завершайте текущую транзакцию перед ним.