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

Какие знаешь принципы ACID?

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

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

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

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

Принципы ACID

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

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

Атомарность означает, что транзакция либо полностью выполняется, либо полностью отменяется. Нет состояния "половинка выполнена". Если во время транзакции происходит ошибка (сбой питания, ошибка БД), то все изменения откатываются.

# Пример: перевод денег между счётами
BEGIN TRANSACTION
  UPDATE accounts SET balance = balance - 100 WHERE id = 1
  UPDATE accounts SET balance = balance + 100 WHERE id = 2
COMMIT
# Либо обе операции выполнены, либо ни одна

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

Согласованность гарантирует, что БД переходит из одного корректного состояния в другое. Все правила, ограничения и инварианты данных соблюдаются до и после транзакции.

# Пример: сумма всех балансов должна оставаться неизменной
# До: счёт1=1000, счёт2=500, итого=1500
# После перевода: счёт1=900, счёт2=600, итого=1500 ✓

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

Изолированность означает, что параллельные транзакции не влияют друг на друга. Каждая транзакция выполняется так, как будто других нет. Это предотвращает грязное чтение, неповторяемое чтение и фантомные строки.

# Без изолированности:
# Транзакция 1: читает balance=1000
# Транзакция 2: изменяет balance=500
# Транзакция 1: читает balance=500 (грязное чтение)

Уровни изоляции в SQL:

  • READ UNCOMMITTED — минимальная защита
  • READ COMMITTED — стандартный уровень
  • REPEATABLE READ — повторяемое чтение
  • SERIALIZABLE — максимальная защита

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

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

# После COMMIT, данные гарантированно на диске
COMMIT  # Данные сохранены
server_crash()  # БД восстановится с сохранёнными данными

Реальный пример: SQLAlchemy

from sqlalchemy import create_engine, Column, Integer
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine(postgresql://...)
Session = sessionmaker(bind=engine)

class Account(Base):
    __tablename__ = accounts
    id = Column(Integer, primary_key=True)
    balance = Column(Integer)

# Транзакция с ACID гарантиями
session = Session()
try:
    # Атомарность: либо обе операции, либо ни одна
    account1 = session.query(Account).filter_by(id=1).first()
    account2 = session.query(Account).filter_by(id=2).first()
    
    account1.balance -= 100  # Изолированность: др. транзакции не видят промежуточное состояние
    account2.balance += 100
    
    session.commit()  # Согласованность: переход в корректное состояние, Долговечность: на диск
except Exception as e:
    session.rollback()  # Откат при ошибке
    raise
finally:
    session.close()

Почему ACID важна?

Без ACID принципов система могла бы потерять деньги при сбоях, создать двойные записи, или позволить грязные данные. ACID гарантирует, что БД всегда в предсказуемом, корректном состоянии.

Важно помнить: не все БД поддерживают полную ACID. Например, некоторые NoSQL БД жертвуют согласованностью ради масштабируемости (BASE модель).

Какие знаешь принципы ACID? | PrepBro