Что такое режим auto-commit в JDBC и когда его использовать?

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

Ответ

Auto-commit — это режим управления транзакциями в JDBC, при котором каждое отдельное SQL-выражение автоматически фиксируется (коммитится) в базе данных сразу после успешного выполнения.

Как работает:

  • По умолчанию для нового соединения auto-commit = true.
  • Каждый вызов executeUpdate(), executeQuery() или аналогичный становится самостоятельной транзакцией.
  • Не требуется явно вызывать connection.commit() или connection.rollback().

Пример включенного auto-commit:

Connection conn = dataSource.getConnection(); // auto-commit = true
Statement stmt = conn.createStatement();

// Каждая вставка — отдельная транзакция. Если вторая упадет, первая уже сохранена.
stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (1, 1000)"); // Коммит 1
stmt.executeUpdate("INSERT INTO accounts (id, balance) VALUES (2, 2000)"); // Коммит 2

Когда использовать auto-commit?

  • Простые одиночные операции, не требующие атомарности (например, логирование, единичные обновления).
  • Скрипты для администрирования БД, где каждый запрос независим.

Когда НЕЛЬЗЯ использовать auto-commit?

  • Группы операций, которые должны быть атомарными (например, перевод денег между счетами).
    conn.setAutoCommit(false); // ВЫКЛЮЧАЕМ auto-commit
    try {
    stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    conn.commit(); // Фиксируем ОБЕ операции вместе
    } catch (SQLException e) {
    conn.rollback(); // Откатываем ОБЕ операции в случае ошибки
    }
  • Пакетная обработка (Batch) для повышения производительности.

Вывод: Auto-commit упрощает код для простых случаев, но для обеспечения целостности данных в сложных сценариях его необходимо отключать, управляя транзакциями вручную.