← Назад к вопросам

Что такое транзакция с точки зрения базы данных?

1.6 Junior🔥 241 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Транзакция в базе данных

Транзакция — это логическая единица работы, которая либо полностью выполняется, либо полностью откатывается. Это фундаментальное понятие в управлении базами данных, обеспечивающее консистентность и надежность данных.

Свойства 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.

Понимание транзакций критично для написания надежного кода, особенно в многопользовательских системах с высокой конкуренцией.

Что такое транзакция с точки зрения базы данных? | PrepBro