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

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

Ответ

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

Свойства ACID:

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

Практический пример на JDBC:

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

    PreparedStatement stmt1 = conn.prepareStatement(
        "UPDATE accounts SET balance = balance - ? WHERE id = ?");
    stmt1.setBigDecimal(1, new BigDecimal("100.00"));
    stmt1.setInt(2, 1);
    stmt1.executeUpdate(); // Списание со счета 1

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

    conn.commit(); // Фиксация всех изменений
} catch (SQLException e) {
    conn.rollback(); // Откат всех изменений при ошибке
    throw e;
} finally {
    conn.setAutoCommit(true); // Восстановление режима по умолчанию
    conn.close();
}