Аббревиатура ACID что означает
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 — это фундамент надёжности в системах, где данные должны быть всегда корректными.