Что такое транзакция в базах данных и каковы её ключевые свойства (ACID)?

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

Ответ

Транзакция — это логическая единица работы с базой данных, которая либо выполняется полностью, либо не выполняется вовсе. Она группирует набор операций (например, INSERT, UPDATE, DELETE) в один атомарный блок.

Свойства транзакций (ACID):

  1. Atomicity (Атомарность): Транзакция выполняется как единое целое. При сбое откатываются все её изменения.
  2. Consistency (Согласованность): Транзакция переводит базу из одного согласованного состояния в другое, не нарушая целостностных ограничений (constraints).
  3. Isolation (Изолированность): Параллельные транзакции не должны влиять друг на друга. Уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable) определяют степень этого влияния.
  4. Durability (Долговечность): После успешного завершения (commit) изменения, внесённые транзакцией, сохраняются в базе данных постоянно, даже в случае сбоя системы.

Пример на SQL:

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

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; -- Списание
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2; -- Зачисление

-- Если обе операции успешны:
COMMIT; -- Фиксация изменений
-- Если произошла ошибка:
ROLLBACK; -- Откат всех изменений в транзакции

Практическое значение:

  • Управление конкурентным доступом: Решает проблемы «грязного» чтения, неповторяющегося чтения и фантомного чтения.
  • Обеспечение целостности данных: Гарантирует, что бизнес-правила (например, сумма на счетах до и после перевода одинакова) не будут нарушены.
  • Восстановление после сбоев: Журнал транзакций (WAL) позволяет восстановить данные.