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

В чем разница между атомарностью и консистентностью?

1.0 Junior🔥 61 комментариев
#Основы Java

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

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

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

Разница между атомарностью и консистентностью в ACID

Эти два свойства транзакций — атомарность (Atomicity) и консистентность (Consistency) — часто путают, потому что они оба связаны с надёжностью данных. Однако они работают на разных уровнях и решают разные проблемы.

Атомарность (Atomicity)

Атомарность гарантирует, что транзакция выполнится либо полностью, либо вообще не выполнится. "Все или ничего".

// Пример: перевод денег между счётами
public void transferMoney(Account from, Account to, BigDecimal amount) {
    // Если в процессе выполнения произойдёт сбой,
    // вся транзакция откатится (rollback)
    
    from.withdraw(amount);     // Шаг 1
    to.deposit(amount);        // Шаг 2
    // Если между шагом 1 и 2 произойдёт сбой БД,
    // оба изменения откатятся - деньги не потеряются
}

Без атомарности: Деньги могут снятись со счёта, но не поступить на другой счёт при крахе.

С атомарностью: Либо переводятся оба платежа, либо ни один.

Консистентность (Consistency)

Консистентность гарантирует, что транзакция переводит БД из одного корректного состояния в другое корректное состояние. БД остаётся в согласованном состоянии.

// Пример: отношение между счётом и остатком на счёте
public class BankAccount {
    private BigDecimal balance;
    private List<Transaction> transactions;
    
    // Консистентность = инвариант: sum(transactions) == balance
    // После любой транзакции это соотношение должно оставаться истинным
}

// Некорректная консистентность:
// Если забыть записать транзакцию в логи,
// balance != sum(transactions) — нарушена консистентность

Консистентность = соблюдение бизнес-правил и ограничений БД.

Ключевые различия

АспектАтомарностьКонсистентность
УровеньУровень выполнения операцийУровень бизнес-логики
ГарантируетПолное выполнение или откатПравила и ограничения БД соблюдены
Кто отвечаетСУБД (транзакции)Приложение + СУБД (constraints)
ПримерДеньги либо переведены, либо нетБаланс не может быть отрицательным
При нарушенииДеньги теряются, дублируютсяНевалидные данные в БД

Реальные примеры

Нарушение атомарности:

// БД упала после withdrawal(), но до deposit()
from: 1000 -> 900  ✓ (в БД)
to:   500 -> ?     ✗ (не записалось)
// Деньги потеряны! Нарушена атомарность

Нарушение консистентности:

// Обе операции выполнились полностью
from: 1000 -> 900  ✓
to:   500 -> 600// Но: есть CHECK constraint CHECK(balance >= 0)
// И если кто-то напрямую в БД установит: balance = -500
// Консистентность нарушена (но атомарность соблюдена)

Как реализуется в Java?

Атомарность — через @Transactional и откаты:

@Transactional
public void transfer(Long fromId, Long toId, BigDecimal amount) {
    // Если выкинется exception, весь метод откатится
    Account from = accountRepo.findById(fromId);
    Account to = accountRepo.findById(toId);
    from.withdraw(amount);
    to.deposit(amount);
    // Если здесь exception — оба изменения откатятся
}

Консистентность — через валидацию и constraints:

@Entity
public class Account {
    @Min(0)  // Constraint: баланс не может быть < 0
    private BigDecimal balance;
}

Итог

  • Атомарность — транзакция либо вся выполнится, либо вся откатится
  • Консистентность — БД остаётся в валидном состоянии (все правила соблюдены)

Они ортогональны: можно иметь атомарность без консистентности (если нарушишь constraints) и наоборот (если не откатишь транзакцию при ошибке).

В чем разница между атомарностью и консистентностью? | PrepBro