Что такое транзакция в контексте баз данных?

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

Ответ

Транзакция — это логическая единица работы с базой данных, которая состоит из последовательности одной или нескольких операций (SQL-запросов). Она выполняется по принципу «всё или ничего»: либо все её изменения фиксируются, либо все откатываются, что гарантирует целостность данных.

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

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

Практический пример на Java (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.setInt(2, 1); // Списываем со счета 1
    stmt1.executeUpdate();

    PreparedStatement stmt2 = conn.prepareStatement(
        "UPDATE accounts SET balance = balance + ? WHERE id = ?"
    );
    stmt2.setBigDecimal(1, new BigDecimal("100.00"));
    stmt2.setInt(2, 2); // Зачисляем на счет 2
    stmt2.executeUpdate();

    conn.commit(); // Фиксируем оба изменения
} catch (SQLException e) {
    conn.rollback(); // При ошибке откатываем ВСЕ изменения транзакции
    throw e;
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

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