Что такое транзакция с точки зрения базы данных?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Транзакция в базе данных
Транзакция — это логическая единица работы, которая либо полностью выполняется, либо полностью откатывается. Это фундаментальное понятие в управлении базами данных, обеспечивающее консистентность и надежность данных.
Свойства ACID
Все транзакции подчиняются принципам ACID:
Atomicity (Атомарность) — транзакция выполняется полностью или не выполняется вообще. Нет промежуточных состояний. Если происходит сбой после частичного выполнения, база данных откатывает все изменения.
Consistency (Консистентность) — база данных переходит из одного консистентного состояния в другое. Все ограничения целостности (PRIMARY KEY, FOREIGN KEY, CHECK) сохраняются.
Isolation (Изолированность) — одновременно выполняющиеся транзакции не влияют друг на друга. Уровни изоляции определяют, какие грязные данные или фантомные строки можно увидеть.
Durability (Стойкость) — после подтверждения (commit) данные остаются в БД даже при сбое системы.
Пример с JDBC
public void transferMoney(Connection conn, int fromAccountId, int toAccountId,
BigDecimal amount) throws SQLException {
try {
// Отключаем автокоммит
conn.setAutoCommit(false);
// Вычитаем со счета отправителя
String debitSql = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
try (PreparedStatement debitStmt = conn.prepareStatement(debitSql)) {
debitStmt.setBigDecimal(1, amount);
debitStmt.setInt(2, fromAccountId);
debitStmt.executeUpdate();
}
// Прибавляем на счет получателя
String creditSql = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
try (PreparedStatement creditStmt = conn.prepareStatement(creditSql)) {
creditStmt.setBigDecimal(1, amount);
creditStmt.setInt(2, toAccountId);
creditStmt.executeUpdate();
}
// Фиксируем транзакцию
conn.commit();
} catch (SQLException e) {
// При ошибке откатываем ВСЕ изменения
conn.rollback();
throw new RuntimeException("Ошибка при переводе денег", e);
} finally {
conn.setAutoCommit(true);
}
}
Уровни изоляции
READ UNCOMMITTED — читаем грязные данные, не закоммиченные другими транзакциями. Самый низкий уровень.
READ COMMITTED — читаем только закоммиченные данные. Стандарт в большинстве БД.
REPEATABLE READ — гарантирует, что повторное чтение одной строки вернет то же значение. Защита от non-repeatable reads.
SERIALIZABLE — максимальная изоляция. Транзакции выполняются как последовательно, даже если они параллельны.
Сохранные точки (Savepoints)
Можно откатить часть транзакции:
conn.setAutoCommit(false);
Savepoint sp1 = conn.setSavepoint("point1");
// выполняем операции
if (someCondition) {
conn.rollback(sp1); // откатываем до point1
}
conn.commit();
Практическое применение в Java
В современных приложениях используются ORM (Hibernate, JPA) и транзакционные фреймворки (Spring @Transactional), которые управляют транзакциями автоматически, скрывая детали JDBC.
Понимание транзакций критично для написания надежного кода, особенно в многопользовательских системах с высокой конкуренцией.