Connection.setAutoCommit()
Включает или выключает автофиксацию. С false несколько запросов объединяются в транзакцию: commit() или rollback().
Доступно с: Java 1.1
Синтаксис
void setAutoCommit(boolean autoCommit) throws SQLExceptionПараметры
| Параметр | Тип | Описание |
|---|---|---|
| autoCommit | boolean | true — каждый запрос сохраняется сразу (по умолчанию), 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.