Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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, и тех, кто реально понимает БД.