Что такое принцип атомарности?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Принцип атомарности
Атомарность (Atomicity) — это фундаментальный принцип в программировании и системах управления базами данных, который означает, что операция либо полностью выполняется, либо полностью откатывается, без возможности частичного выполнения. Атомарность — первый принцип в ACID (Atomicity, Consistency, Isolation, Durability).
Атомарность в транзакциях БД
В контексте баз данных атомарность означает, что транзакция либо полностью завершится (commit), либо полностью откатится (rollback). Промежуточных состояний не бывает.
Пример: Передача денег между счётами
// Без атомарности — опасно!
String updateFromAccount = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
String updateToAccount = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";
// Если произойдёт сбой между этими двумя операциями,
// деньги потеряются!
С атомарностью (транзакция):
@Transactional // Spring управляет транзакцией
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
Account from = accountRepository.findById(fromId).orElseThrow();
Account to = accountRepository.findById(toId).orElseThrow();
from.setBalance(from.getBalance().subtract(amount));
to.setBalance(to.getBalance().add(amount));
accountRepository.save(from);
accountRepository.save(to);
// Если произойдёт исключение ДО commit,
// ВСЕ изменения откатятся
}
Атомарность в многопоточном программировании
В Java атомарность также означает, что операция над переменной неделима — её нельзя прервать в процессе выполнения другим потоком. Для этого используются:
1. Volatile переменные (только видимость)
public class Counter {
private volatile int count = 0; // видимость гарантирована
public void increment() {
count++; // НЕ атомарна! (read-modify-write из 3 операций)
}
}
2. AtomicInteger / AtomicLong
import java.util.concurrent.atomic.AtomicInteger;
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Атомарная операция
}
public int getCount() {
return count.get();
}
}
Пример конкуренции без атомарности:
public class UnsafeCounter {
private int count = 0;
public void increment() {
count++; // 3 машинные операции: load, add, store
}
}
// Если 2 потока вызывают increment() одновременно:
// Поток 1: load (count=0) -> add -> store (count=1)
// Поток 2: load (count=0) -> add -> store (count=1)
// Результат: count=1, но должен быть 2!
С AtomicInteger:
public class SafeCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Атомарно!
}
}
// Даже если 2 потока вызывают increment() одновременно,
// оба increments выполнятся корректно
3. Synchronized блоки
public class SynchronizedCounter {
private int count = 0;
public synchronized void increment() {
count++; // Теперь атомарна
}
public synchronized int getCount() {
return count;
}
}
4. Lock интерфейс
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockCounter {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++; // Защищено
} finally {
lock.unlock();
}
}
}
ACID и атомарность
Атомарность в ACID означает:
- Все операции в транзакции либо выполнены, либо отменены
- Нет частичных результатов
- Система остаётся в консистентном состоянии
Когда нужна атомарность
- Финансовые системы: переводы денег
- Заказы: изменение статуса с проверкой запасов
- Распределённые системы: consensus алгоритмы
- Многопоточное ПО: защита от race conditions
Атомарность — критически важный концепт для написания надёжного и безопасного кода.