Ответ
Транзакция будет откатана (rollback) полностью. Это следует из принципа атомарности (ACID): транзакция либо фиксируется вся, либо не фиксируется вовсе.
Типичный сценарий в JDBC:
try (Connection conn = dataSource.getConnection()) {
conn.setAutoCommit(false); // 1. Начало транзакции
// 2. Первый успешный UPDATE
try (PreparedStatement stmt1 = conn.prepareStatement(
"UPDATE accounts SET balance = balance - 100 WHERE id = 1")) {
stmt1.executeUpdate();
}
// 3. Второй UPDATE вызывает ошибку (например, нарушение ограничения)
try (PreparedStatement stmt2 = conn.prepareStatement(
"UPDATE accounts SET balance = balance + 100 WHERE id = 999")) {
stmt2.executeUpdate(); // Может выбросить SQLException
}
conn.commit(); // 4. Эта строка не будет достигнута из-за исключения
} catch (SQLException e) {
// 5. При возникновении исключения происходит автоматический rollback.
// Изменения из первого UPDATE НЕ будут сохранены в БД.
}
Ключевые моменты:
- При выбросе
SQLExceptionдо вызоваcommit()JDBC автоматически выполняет откат. - Если
autoCommit = true, каждый statement — отдельная транзакция, и первыйUPDATEуже будет зафиксирован. - Для управления вручную используйте
conn.rollback()в блокеcatch.