Может ли одна транзакция в базе данных включать несколько SQL-операций?

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

Ответ

Да, обязательно может и обычно так и происходит. Транзакция — это логическая единица работы, которая группирует несколько операций в одно атомарное целое.

Ключевые свойства транзакции (ACID):

  • Атомарность (Atomicity): Все операции транзакции выполняются как одно целое — либо все, либо ничего.
  • Согласованность (Consistency): Транзакция переводит БД из одного согласованного состояния в другое.
  • Изолированность (Isolation): Параллельные транзакции не мешают друг другу.
  • Долговечность (Durability): Результаты завершенной транзакции сохраняются навсегда.

Типичный пример транзакции с несколькими операциями (перевод денег):

START TRANSACTION; -- Начало транзакции

-- Операция 1: Списание со счета A
UPDATE accounts SET balance = balance - 100.00 WHERE user_id = 1;

-- Операция 2: Зачисление на счет B
UPDATE accounts SET balance = balance + 100.00 WHERE user_id = 2;

-- Операция 3: Запись в журнал операций
INSERT INTO transactions (from_user, to_user, amount) VALUES (1, 2, 100.00);

COMMIT; -- Фиксация всех изменений. Если здесь ошибка, все три UPDATE/INSERT откатятся.
-- или ROLLBACK; -- Откат всех изменений в случае проблемы.

Практическое значение: Эта возможность критична для поддержания целостности данных в сложных бизнес-процессах, таких как финансовые операции, обработка заказов или обновление связанных сущностей.