Что обеспечивают принципы ACID в базах данных?

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

Ответ

ACID — это набор свойств, гарантирующих надежное выполнение транзакций в СУБД.

  • A (Atomicity) — Атомарность: Транзакция выполняется как единое целое. Либо выполняются все ее операции, либо ни одна. При сбое происходит полный откат (rollback).
  • C (Consistency) — Согласованность: Транзакция переводит базу данных из одного валидного состояния в другое, соблюдая все заданные ограничения (constraints, триггеры).
  • I (Isolation) — Изолированность: Параллельно выполняемые транзакции не влияют друг на друга. Уровни изоляции (Read Committed, Repeatable Read и др.) определяют степень этой изоляции.
  • D (Durability) — Долговечность: После успешного завершения транзакции (commit) внесенные ею изменения сохраняются в базе данных окончательно, даже в случае сбоя системы.

Пример на JDBC:

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false); // Начало транзакции

    PreparedStatement stmt1 = conn.prepareStatement(
        "UPDATE accounts SET balance = balance - ? WHERE id = ?"
    );
    stmt1.setBigDecimal(1, new BigDecimal("100.00"));
    stmt1.setLong(2, 1L);
    stmt1.executeUpdate();

    PreparedStatement stmt2 = conn.prepareStatement(
        "UPDATE accounts SET balance = balance + ? WHERE id = ?"
    );
    stmt2.setBigDecimal(1, new BigDecimal("100.00"));
    stmt2.setLong(2, 2L);
    stmt2.executeUpdate();

    conn.commit(); // Фиксация (Durability)
} catch (SQLException e) {
    conn.rollback(); // Откат при ошибке (Atomicity)
    throw e;
}