Ответ
ACID — это набор из четырех ключевых свойств, которые гарантируют надежность и целостность данных при выполнении транзакций в базах данных, даже в случае ошибок, сбоев питания или других непредвиденных проблем.
Расшифровка свойств:
-
Atomicity (Атомарность) Принцип "всё или ничего". Транзакция представляет собой неделимую единицу работы: она либо выполняется полностью и успешно, либо, в случае сбоя, полностью отменяется (откатывается), не оставляя после себя частичных изменений.
-
Consistency (Согласованность) Транзакция переводит базу данных из одного корректного (валидного) состояния в другое. Любые данные, записанные в БД, должны соответствовать всем установленным правилам и ограничениям (constraints, cascades, triggers).
-
Isolation (Изолированность) Параллельно выполняемые транзакции не должны влиять друг на друга. Результат их одновременного выполнения должен быть таким же, как если бы они выполнялись последовательно. Это достигается с помощью механизмов блокировок и уровней изоляции транзакций.
-
Durability (Долговечность) Если транзакция была успешно завершена (закоммичена), то сделанные ею изменения являются постоянными и не будут потеряны даже в случае последующего сбоя системы (например, перезагрузки или отключения питания).
Пример транзакции (Python + SQLite):
import sqlite3
# Представим перевод денег с одного счета на другой
conn = sqlite3.connect("bank.db")
cursor = conn.cursor()
# ID счетов
from_account_id = 1
to_account_id = 2
amount = 100
try:
# Начало транзакции
cursor.execute("BEGIN TRANSACTION")
# 1. Списание со счета (Consistency: баланс не может стать отрицательным, если есть CHECK)
cursor.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (amount, from_account_id))
# 2. Зачисление на счет
cursor.execute("UPDATE accounts SET balance = balance + ? WHERE id = ?", (amount, to_account_id))
# Если оба запроса успешны, фиксируем изменения
conn.commit() # Durability: изменения сохранены
print("Транзакция успешно завершена.")
except sqlite3.Error as e:
# Atomicity: при любой ошибке откатываем все изменения
print(f"Ошибка транзакции, откат: {e}")
conn.rollback()
finally:
conn.close()
В этом примере атомарность гарантирует, что деньги либо будут переведены, либо останутся на исходном счете, но никогда не "потеряются".