Ответ
При ошибке в транзакции происходит откат (rollback) всех изменений, сделанных в её рамках. Это обеспечивает атомарность (Atomicity) — одно из свойств ACID.
Почему это важно: Откат гарантирует целостность данных — либо выполняются все операции транзакции, либо ни одна.
Пример на JDBC:
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false);
// Операции внутри транзакции
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(); // Автоматический откат при ошибке
} finally {
conn.setAutoCommit(true);
conn.close();
}
В Spring с @Transactional:
- Для unchecked исключений (
RuntimeExceptionи его наследников) откат происходит автоматически. - Для checked исключений (
Exception) нужно явно указать атрибут:@Transactional(rollbackFor = Exception.class)