Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Атомарность в 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();
}
}
}
Практические аспекты
- Откат данных — при ошибке все изменения отменяются
- Консистентность — никогда не бывает полупереводов денег
- Производительность — длинные транзакции блокируют ресурсы
- Умные размеры — транзакция должна быть достаточно маленькой
Важные замечания
- Атомарность не гарантирует корректность бизнес-логики (это консистентность)
- Атомарность работает только в пределах одной транзакции
- Для микросервисов нужны другие подходы (Saga pattern, compensation)
В кратце: атомарность — это «всё или ничего». Либо транзакция полностью успешна, либо её вообще не было.