Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

Connection.setAutoCommit()

Включает или выключает автофиксацию. С false несколько запросов объединяются в транзакцию: commit() или rollback().

Доступно с: Java 1.1

Синтаксис

void setAutoCommit(boolean autoCommit) throws SQLException

Параметры

ПараметрТипОписание
autoCommitbooleantrue — каждый запрос сохраняется сразу (по умолчанию), false — только после commit().

Примеры

Перевод денег: оба изменения сохраняются вместе:

import java.sql.*;
 
void main() throws SQLException {
    try (Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:")) {
        try (Statement st = conn.createStatement()) {
            st.executeUpdate("CREATE TABLE accounts (name TEXT, balance INTEGER)");
            st.executeUpdate("INSERT INTO accounts VALUES ('Anna', 100), ('Oleg', 20)");
        }
 
        conn.setAutoCommit(false);
        try (PreparedStatement ps = conn.prepareStatement(
                "UPDATE accounts SET balance = balance + ? WHERE name = ?")) {
            ps.setInt(1, -30);
            ps.setString(2, "Anna");
            ps.executeUpdate();
            ps.setInt(1, 30);
            ps.setString(2, "Oleg");
            ps.executeUpdate();
        }
        conn.commit();
 
        try (Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT name, balance FROM accounts")) {
            while (rs.next()) {
                IO.println(rs.getString(1) + ": " + rs.getInt(2));
            }
        }
    }
}

Результат:

Anna: 70
Oleg: 50

Ошибка посередине — rollback() отменяет уже выполненное списание:

import java.sql.*;
 
void main() throws SQLException {
    try (Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:")) {
        try (Statement st = conn.createStatement()) {
            st.executeUpdate("CREATE TABLE accounts (name TEXT, balance INTEGER CHECK (balance >= 0))");
            st.executeUpdate("INSERT INTO accounts VALUES ('Anna', 100), ('Oleg', 20)");
        }
 
        conn.setAutoCommit(false);
        try (Statement st = conn.createStatement()) {
            st.executeUpdate("UPDATE accounts SET balance = balance + 50 WHERE name = 'Anna'");
            st.executeUpdate("UPDATE accounts SET balance = balance - 50 WHERE name = 'Oleg'");
            conn.commit();
        } catch (SQLException e) {
            conn.rollback();
            IO.println("Rolled back: " + e.getMessage());
        }
 
        try (Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT name, balance FROM accounts")) {
            while (rs.next()) {
                IO.println(rs.getString(1) + ": " + rs.getInt(2));
            }
        }
    }
}

Результат:

Rolled back: [SQLITE_CONSTRAINT_CHECK] A CHECK constraint failed (CHECK constraint failed: balance >= 0)
Anna: 100
Oleg: 20

Примечания

По умолчанию автофиксация включена, и каждый запрос сразу становится постоянным. Транзакция нужна, когда несколько изменений должны выполниться все или ни одного. После setAutoCommit(false) обязательно вызовите commit(), иначе изменения пропадут при закрытии соединения, а при ошибке — rollback(). Если соединение возвращается в пул, верните setAutoCommit(true). Промежуточные точки отката создаёт setSavepoint().

См. также

  • DriverManager.getConnection() — Открывает соединение с базой данных по JDBC-адресу.
  • PreparedStatement — Заранее подготовленный SQL-запрос с параметрами ?. Защищает от SQL-инъекций.
  • try-with-resources — Блок `try`, который сам закрывает открытые ресурсы — файлы, соединения, потоки.

Вопросы и ответы по теме

В учебнике

  • Транзакции — Транзакции в JDBC — режим автофиксации, setAutoCommit(false), commit и rollback, перевод денег между счетами и надёжный шаблон с try-with-resources.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.