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

Расшифруй аббревиатуру ACID

1.0 Junior🔥 231 комментариев
#Базы данных (SQL)

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

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

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

ACID — Основные принципы транзакций в БД

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

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

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

# Пример: перевод денег со счёта на счёт
try:
    account1.balance -= 100
    account2.balance += 100
    db.commit()  # Либо оба изменения сохранены, либо оба откачены
except Exception:
    db.rollback()  # Откатываем все изменения

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

C — Consistency (Согласованность)

База данных переходит из одного непротиворечивого состояния в другое. После транзакции все правила и ограничения (constraints) остаются действительны.

# Пример: правило — сумма баланса двух счётов не меняется
BEFORE: account1 = 1000, account2 = 500  # Сумма = 1500

TRANSACTION: Transfer 100

AFTER: account1 = 900, account2 = 600  # Сумма = 1500 (консистентно)

Это бизнес-правило, не техническое. БД не допустит нарушение констрейнтов (UNIQUE, FOREIGN KEY, CHECK).

I — Isolation (Изолированность)

Транзакции выполняются независимо друг от друга, не влияя на промежуточные результаты.

# Транзакция 1
TRANSACTION 1:
    SELECT balance FROM account WHERE id=1  # Читает 1000
    UPDATE account SET balance=900 WHERE id=1
    
# Транзакция 2 (параллельно)
TRANSACTION 2:
    SELECT balance FROM account WHERE id=1  # Должна видеть ?

Зависит от уровня изолированности:

  • READ UNCOMMITTED — видит грязные (незафиксированные) данные
  • READ COMMITTED — видит только подтверждённые данные (стандарт)
  • REPEATABLE READ — не видит изменения, которые произошли после начала транзакции
  • SERIALIZABLE — самый строгий, работает как последовательное выполнение

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

Однажды подтверждённые данные остаются в БД, даже при сбое питания или краша приложения.

db.commit()  # После этой операции данные на диске (в журнале)
# Даже если сервер упадёт в следующую секунду,
# данные восстановятся при перезагрузке

Достигается через журналирование (WAL — Write-Ahead Logging).

Практический пример в коде

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine(postgresql://localhost/bank)
Session = sessionmaker(bind=engine)

session = Session()
try:
    # ACID гарантирует, что оба UPDATE либо выполнятся, либо откатятся
    account1 = session.query(Account).filter_by(id=1).with_for_update().first()
    account2 = session.query(Account).filter_by(id=2).with_for_update().first()
    
    account1.balance -= 100
    account2.balance += 100
    
    session.commit()  # Атомарно
except Exception as e:
    session.rollback()  # Откат при любой ошибке
    raise
finally:
    session.close()

Почему это важно для интервью

Понимание ACID показывает, что ты:

  • Работал с транзакциями в production
  • Понимаешь race conditions
  • Знаешь, когда использовать with_for_update() или уровни изолированности
  • Проектируешь надёжные системы

Это вопрос, который отсекает тех, кто просто запускал SELECT/INSERT, и тех, кто реально понимает БД.

Расшифруй аббревиатуру ACID | PrepBro