Ответ
Транзакция — это логическая единица работы с базой данных, которая состоит из одной или нескольких операций. Она выполняется по принципу "всё или ничего": либо все изменения фиксируются, либо все откатываются, что гарантирует целостность данных.
Свойства ACID:
- Atomicity (Атомарность): Транзакция выполняется полностью или не выполняется вовсе.
- Consistency (Согласованность): Транзакция переводит базу данных из одного валидного состояния в другое.
- Isolation (Изолированность): Параллельные транзакции не влияют друг на друга. Уровни изоляции (READ_COMMITTED, REPEATABLE_READ и др.) определяют степень этого влияния.
- Durability (Долговечность): После подтверждения (commit) изменения сохраняются даже при сбое системы.
Практический пример на JDBC:
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // Начало транзакции (отключение auto-commit)
PreparedStatement stmt1 = conn.prepareStatement(
"UPDATE accounts SET balance = balance - ? WHERE id = ?");
stmt1.setBigDecimal(1, new BigDecimal("100.00"));
stmt1.setInt(2, 1);
stmt1.executeUpdate(); // Списание со счета 1
PreparedStatement stmt2 = conn.prepareStatement(
"UPDATE accounts SET balance = balance + ? WHERE id = ?");
stmt2.setBigDecimal(1, new BigDecimal("100.00"));
stmt2.setInt(2, 2);
stmt2.executeUpdate(); // Зачисление на счет 2
conn.commit(); // Фиксация всех изменений
} catch (SQLException e) {
conn.rollback(); // Откат всех изменений при ошибке
throw e;
} finally {
conn.setAutoCommit(true); // Восстановление режима по умолчанию
conn.close();
}