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

Опиши каждый из принципов ACID

2.0 Middle🔥 181 комментариев
#Базы данных и SQL

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

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

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

Принципы ACID

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

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

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

Пример:

Представьте перевод денег со счёта A на счет B:

public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
    begin();
    try {
        fromAccount.withdraw(amount);
        toAccount.deposit(amount);
        commit();
    } catch (Exception e) {
        rollback();
    }
}

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

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

Консистентность — это гарантия, что база данных переходит из одного валидного состояния в другое валидное состояние. Все бизнес-правила и ограничения соблюдаются.

Примеры ограничений:

ALTER TABLE users ADD PRIMARY KEY (id);
ALTER TABLE users ADD UNIQUE (email);
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);
ALTER TABLE accounts ADD CHECK (balance >= 0);

БД сама проверяет консистентность:

Если попытаться нарушить FOREIGN KEY, база откажет:

INSERT INTO orders (user_id, amount) VALUES (999, 100);
-- ERROR: Нет пользователя с id=999!

I — Isolation (Изоляция)

Изоляция — это гарантия, что одновременные (параллельные) транзакции не мешают друг другу. Результат одной транзакции не влияет на другую.

Уровни изоляции (от слабого к сильному):

Connection conn = dataSource.getConnection();

// READ_UNCOMMITTED — совсем нет изоляции
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

// READ_COMMITTED — стандартный
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

// REPEATABLE_READ — повторяемое чтение
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

// SERIALIZABLE — полная изоляция
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

D — Durability (Долговечность)

Долговечность — это гарантия, что как только транзакция подтверждена (commit), данные сохранятся навсегда, несмотря на системные сбои.

Как БД гарантирует долговечность:

  1. Write-Ahead Logging (WAL) — запись в лог перед записью в основную БД
  2. Fsync — синхронизация данных на диск
  3. Репликация — копирование данных на другие серверы
statement.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
conn.commit();  // <- Данные гарантированно на диске

Bез долговечности данные могут быть потеряны при сбое сервера.

Взаимодействие принципов

public void complexTransaction() {
    try {
        conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
        conn.setAutoCommit(false);
        
        begin();
        
        Account from = getAccountForUpdate(1);
        Account to = getAccountForUpdate(2);
        
        if (from.getBalance() < 100) {
            throw new InsufficientFundsException();
        }
        
        from.setBalance(from.getBalance() - 100);
        to.setBalance(to.getBalance() + 100);
        
        saveAll(from, to);
        commit();
        
    } catch (Exception e) {
        rollback();
    }
}

Заключение

ACID — это основа надёжных баз данных:

  • A (Atomicity) — всё или ничего
  • C (Consistency) — правила соблюдаются
  • I (Isolation) — не мешаем друг другу
  • D (Durability) — данные вечны

SQL-базы (PostgreSQL, MySQL, Oracle) полностью поддерживают ACID. NoSQL БД часто жертвуют некоторыми принципами для скорости и масштабируемости.

Опиши каждый из принципов ACID | PrepBro