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

Что такое атомарность в ACID?

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

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

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

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

# Атомарность в ACID

Атомарность (Atomicity) — это первый принцип ACID (Atomicity, Consistency, Isolation, Durability), который гарантирует, что транзакция либо полностью выполнится, либо полностью откатится. Нет промежуточных состояний — транзакция либо успешна, либо её не было.

Основной принцип

Любая транзакция рассматривается как одна неделимая единица работы. Если в процессе выполнения возникает ошибка, система откатывает все изменения, сделанные в этой транзакции, и база данных возвращается в исходное состояние.

Пример с SQL

BEGIN TRANSACTION;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

Если вторая операция UPDATE не выполнится (например, счёта нет), то первая операция также откатывается. Деньги не исчезнут в никуда.

Реализация в Java

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false);
    
    String sql1 = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
    String sql2 = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
    
    PreparedStatement stmt1 = conn.prepareStatement(sql1);
    stmt1.setInt(1, 100);
    stmt1.setInt(2, 1);
    stmt1.executeUpdate();
    
    PreparedStatement stmt2 = conn.prepareStatement(sql2);
    stmt2.setInt(1, 100);
    stmt2.setInt(2, 2);
    stmt2.executeUpdate();
    
    conn.commit();  // Если дошли сюда — атомарность выполнена
} catch (SQLException e) {
    conn.rollback();  // Откатываем ВСЕ изменения
    throw new RuntimeException("Транзакция не выполнена", e);
} finally {
    conn.close();
}

С использованием Spring транзакций

@Service
public class TransferService {
    @Autowired
    private AccountRepository accountRepository;
    
    @Transactional  // Spring управляет атомарностью
    public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
        Account from = accountRepository.findById(fromId)
            .orElseThrow(() -> new AccountNotFoundException());
        Account to = accountRepository.findById(toId)
            .orElseThrow(() -> new AccountNotFoundException());
        
        from.withdraw(amount);
        to.deposit(amount);
        
        accountRepository.save(from);
        accountRepository.save(to);
        
        // Если произойдёт исключение ЗДЕСЬ — всё откатится
        if (to.getBalance() < 0) {
            throw new InsufficientFundsException();
        }
    }
}

Практические аспекты

  1. Откат данных — при ошибке все изменения отменяются
  2. Консистентность — никогда не бывает полупереводов денег
  3. Производительность — длинные транзакции блокируют ресурсы
  4. Умные размеры — транзакция должна быть достаточно маленькой

Важные замечания

  • Атомарность не гарантирует корректность бизнес-логики (это консистентность)
  • Атомарность работает только в пределах одной транзакции
  • Для микросервисов нужны другие подходы (Saga pattern, compensation)

В кратце: атомарность — это «всё или ничего». Либо транзакция полностью успешна, либо её вообще не было.