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

Аббревиатура ACID что означает

2.0 Middle🔥 211 комментариев
#Архитектура и паттерны#Базы данных (SQL)

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

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

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

ACID в базах данных

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

  • A — Atomicity (Атомарность)
  • C — Consistency (Согласованность)
  • I — Isolation (Изолированность)
  • D — Durability (Надёжность)

Эти четыре свойства гарантируют, что данные в БД остаются корректными, даже при сбоях и конфликтах.

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

Атомарность означает, что транзакция либо полностью выполняется, либо полностью откатывается. Нет частичного выполнения.

import sqlite3

conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# Создаём таблицу
cursor.execute('''
    CREATE TABLE accounts (
        id INTEGER PRIMARY KEY,
        name TEXT,
        balance REAL
    )
''')

cursor.execute("INSERT INTO accounts VALUES (1, 'John', 1000)")
cursor.execute("INSERT INTO accounts VALUES (2, 'Jane', 500)")
conn.commit()

# Атомарная транзакция
try:
    cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
    cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
    conn.commit()
    print("Деньги переведены успешно")
except Exception as e:
    conn.rollback()
    print(f"Ошибка: {e}")

Если произойдёт ошибка (отключение электричества, крах), либо обе операции будут выполнены, либо ни одна.

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

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

# Пример: состояние должно быть всегда корректным
# Ограничение: balance >= 0

try:
    cursor.execute("UPDATE accounts SET balance = -100 WHERE id = 1")
    conn.commit()
except Exception as e:
    conn.rollback()
    print("Нарушено ограничение целостности!")

# Правильная операция
cursor.execute("UPDATE accounts SET balance = 500 WHERE id = 1")
conn.commit()

# Проверяем консистентность
cursor.execute("SELECT SUM(balance) FROM accounts")
total = cursor.fetchone()[0]
print(f"Общий баланс: {total}")

Все ограничения (primary key, foreign key, check constraints) должны соблюдаться.

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

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

import threading
import time

# Две транзакции одновременно
def transaction1():
    cursor.execute("BEGIN")
    cursor.execute("SELECT balance FROM accounts WHERE id = 1")
    balance = cursor.fetchone()[0]
    time.sleep(0.1)
    cursor.execute("UPDATE accounts SET balance = ? WHERE id = 1", (balance - 50,))
    cursor.execute("COMMIT")

def transaction2():
    cursor.execute("BEGIN")
    cursor.execute("SELECT balance FROM accounts WHERE id = 1")
    balance = cursor.fetchone()[0]
    time.sleep(0.1)
    cursor.execute("UPDATE accounts SET balance = ? WHERE id = 1", (balance - 50,))
    cursor.execute("COMMIT")

t1 = threading.Thread(target=transaction1)
t2 = threading.Thread(target=transaction2)
t1.start()
t2.start()
t1.join()
t2.join()

Уровни изолированности:

  • READ UNCOMMITTED — грязное чтение (наименее изолировано)
  • READ COMMITTED — чтение коммитанных данных
  • REPEATABLE READ — повторяемое чтение
  • SERIALIZABLE — полная изолированность (как последовательное выполнение)

D — Durability (Надёжность)

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

# После commit() данные в БД
cursor.execute("UPDATE accounts SET balance = 800 WHERE id = 1")
conn.commit()

# Даже если сейчас отключится электричество,
# данные сохранятся в БД
print("Данные надёжно сохранены")

Базы данных используют журналы операций (write-ahead logs) и контрольные точки для гарантии durability.

Взаимосвязь свойств

TRANSACTION START
    ↓
[ATOMICITY] Либо все операции, либо ничего
    ↓
[CONSISTENCY] Все ограничения целостности соблюдены
    ↓
[ISOLATION] Транзакции не мешают друг другу
    ↓
[DURABILITY] Данные сохранены на диск
    ↓
TRANSACTION COMPLETE

ACID в Python + SQLAlchemy

from sqlalchemy import create_engine, Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()

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

engine = create_engine("postgresql://user:password@localhost/db")
Session = sessionmaker(bind=engine)
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()
    print("Транзакция успешна")
except Exception as e:
    session.rollback()
    print(f"Ошибка: {e}")
finally:
    session.close()

Когда нужны ACID?

  • Финансовые системы — переводы денег
  • Инвентарь — запасы товаров
  • Заказы — создание, оплата, доставка
  • Критичные данные — где частичное выполнение недопустимо

ACID — это фундамент надёжности в системах, где данные должны быть всегда корректными.

Аббревиатура ACID что означает | PrepBro