Ответ
Транзакция — это логическая единица работы с базой данных, которая состоит из последовательности одной или нескольких операций (SQL-запросов). Она выполняется по принципу «всё или ничего»: либо все её изменения фиксируются, либо все откатываются, что гарантирует целостность данных.
Свойства транзакций (ACID):
- Атомарность (Atomicity) – Транзакция выполняется полностью. При сбое все изменения откатываются.
- Согласованность (Consistency) – Транзакция переводит базу из одного валидного состояния в другое, соблюдая все правила и ограничения (constraints).
- Изолированность (Isolation) – Параллельные транзакции не должны влиять друг на друга. Степень изоляции настраивается.
- Долговечность (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();
}
Зачем это нужно: Транзакции критически важны для финансовых операций, регистраций, инвентаризации — любых процессов, где частичное выполнение привело бы к нарушению логики и целостности данных.