Понятия в БД, часть 1. ACID



Когда я была беспечным джуниором, то представляла базу данных как всемогущий цилиндр. Записываешь туда что-то, а потом читаешь.



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



Есть популярный вопрос на собесах про свойства БД. Предполагается, что кандидат назовёт аббревиатуру ACID и cкажет 4 главных слова — Atomicity, Consistency, Isolation, Durability Сегодня и поговорим об этих прекрасных буквах.



Когда БД обозначена как ACID-compliant, ожидается:



🔸 A — Atomicity



Можно объединить несколько операций в одну транзакцию. Если произойдёт ошибка, уже сделанные операции в группе отменятся.



Благодаря этому можно не держать в коде несколько версий данных "на всякий случай" и восстанавливаться после ошибок гораздо проще



🔸 C — Consistency



Ограничения в БД (constraints) соблюдаются всегда и везде. Если две транзакции захотят записать одинаковые значения в UNIQUE колонку, одна транзакция завершится ошибкой.



На практике большинство проверок находятся в коде, поэтому у базы здесь мало работы



🔸 I — Isolation



Каждая транзакция выполняется так, как будто других транзакций не существует.



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



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



Важный момент: constaints для одной строки (CHECK, UNIQUE и тд) железно выполняются. Аномалии встречаются в транзакциях, где изменения состоят из нескольких шагов или меняются несколько строк.



Чтобы перевести 100 рублей с одного аккаунта на другой, нужно снять с первого аккаунта 100 рублей и добавить их на баланс второго. Целостность данных в середине процесса ненадолго нарушится. От уровня изоляции зависит, заметят ли это несоответствие другие транзакции.



Подробно поговорим об этом в следующем посте!



🔸 D — Durability



Если данные записаны в БД, они не потеряются. Здесь два пути:

▫️ Запись на носитель, например, жёсткий диск или SSD

▫️ Отправка копий на другие сервера



100% надёжности на тысячи лет не будет, но сохранность данных — наименее проблемный пункт из всех остальных



Резюме



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



Поэтому сегодня ACID чаще встречается не в техническом описании, а в маркетинговых текстах рядом с цифровой трансформацией и дизайн-мышлением. Многие БД не берут на себя грех называться ACID-compliant, а используют более мягкую аббревиатуру BASE. Её тоже обсудим чуть позже