Транзакции ACID
Что такое транзакция?
В контексте баз данных и систем хранения данных транзакция — это любая операция, которая рассматривается как единая единица работы, которая либо завершается полностью, либо не завершается вообще, и оставляет систему хранения в согласованном состоянии. Классическим примером транзакции является то, что происходит, когда вы снимаете деньги со своего банковского счета. Либо деньги покинули ваш банковский счет, либо нет — промежуточного состояния быть не может.
Понимание транзакций ACID
Транзакция ACID — это набор свойств, которые обеспечивают надежность и согласованность транзакции в базе данных. Транзакции — это серия операций, которые выполняются как единое целое, с использованием операций чтения и записи для доступа к данным. Большинство баз данных обеспечивают транзакционные гарантии для операций, которые влияют только на одну запись. В этом разделе будут даны основные определения характеристик, задействованных в транзакции ACID.
Свойства A.C.I.D.: Атомарность, Согласованность, Изолированность и Долговечность
ACID — это аббревиатура, обозначающая набор из 4 ключевых свойств, определяющих транзакцию: Атомарность, Согласованность, Изолированность и Долговечность (Atomicity, Consistency, Isolation, Durability). Если операция базы данных обладает этими свойствами ACID, ее можно назвать транзакцией ACID, а системы хранения данных, применяющие эти операции, называются транзакционными системами. Транзакции ACID гарантируют, что каждое чтение, запись или изменение таблицы обладает следующими свойствами:
Атомарность — каждый оператор в транзакции (для чтения, записи, обновления или удаления данных) рассматривается как единое целое. Либо выполняется весь оператор, либо не выполняется ни один из них. Это свойство предотвращает потерю и повреждение данных, например, в случае сбоя источника потоковых данных в середине потока.
Согласованность — гарантирует, что транзакции вносят изменения в таблицы только предопределенными, предсказуемыми способами. Транзакционная согласованность гарантирует, что повреждения или ошибки в ваших данных не приведут к непредвиденным последствиям для целостности вашей таблицы.
Изоляция — когда несколько пользователей одновременно читают и записывают данные из одной таблицы, изоляция их транзакций гарантирует, что параллельные транзакции не будут мешать или влиять друг на друга. Каждый запрос может выполняться так, как будто они происходят один за другим, даже если на самом деле они происходят одновременно.
Долговечность — гарантирует, что изменения ваших данных, сделанные успешно выполненными транзакциями, будут сохранены даже в случае сбоя системы.
Почему нужны транзакции ACID?
Транзакции ACID обеспечивают максимально возможную надежность и целостность данных. Они гарантируют, что ваши данные никогда не попадут в противоречивое состояние из-за того, что операция завершилась лишь частично. Например, без транзакций ACID, если вы записывали некоторые данные в таблицу базы данных, но неожиданно отключилось электричество, возможно, что только часть ваших данных была бы сохранена, а часть нет. Теперь ваша база данных находится в непоследовательном состоянии, восстановить которое очень сложно и долго.
Как работают транзакции?
Транзакции ACID поддерживают целостность данных, придерживаясь ряда шагов. Описанные шаги — это обычный способ реализации транзакций ACID в базах данных, но возможны вариации или различия в реализации в зависимости от конкретной используемой системы баз данных.
- Начать транзакцию: Объявление оператора BEGIN TRANSACTION инициирует транзакцию и устанавливает точку сохранения, от которой транзакция может быть откачена при необходимости.
- Выполнить операции: Все операции внутри транзакции выполняются по очереди. База данных проверяет каждую операцию на соответствие ограничениям и схеме.
- Зафиксировать или откатить: После успешного завершения всех операций транзакция фиксируется с помощью оператора COMMIT. Если какая-либо операция завершилась неудачно, транзакция откатывается к точке сохранения, установленной в начале транзакции.
Пример транзакции в действии
Рассмотрим банковское приложение, в котором пользователь хочет перевести средства с одного счета на другой, где транзакция может выглядеть следующим образом:
- НАЧАТЬ ТРАНЗАКЦИЮ (BEGIN TRANSACTION) — Пример снятия денег в банке с помощью чека, платежного поручения или через банкомат.
- Вычтите сумму перевода со счета источника.
- Добавьте сумму перевода на счет назначения.
- COMMIT — обновление записи о транзакции, выполненной клиентом.
Транзакция откатывается, и база данных восстанавливается в исходное состояние, если какая-либо из операций завершилась неудачно, например, если на счете источника недостаточно средств.
Варианты использования
Транзакции ACID подходят для многих случаев использования. Ниже приведены некоторые примеры:
Банковское дело
Банки используют ACID-транзакции для обеспечения точной и безопасной обработки платежей и других финансовых операций. Например, когда клиент снимает деньги в банкомате, выполняется транзакция ACID для обновления баланса счета и регистрации операции. Транзакция является атомарной, то есть она выполняется успешно или не выполняется, а баланс счета остается постоянным.
Системы здравоохранения
Системы здравоохранения используют транзакции ACID, чтобы гарантировать точность обновления записей пациентов и защиту конфиденциальных медицинских данных. Электронные медицинские карты содержат персональную информацию о пациентах, которая должна быть точной и последовательной. Например, транзакция ACID происходит, когда врач обновляет информацию о лекарствах пациента в EHR, чтобы гарантировать, что данные обновляются атомарно, последовательно и долговечно.
Приложения электронной коммерции
Приложения электронной коммерции используют транзакции ACID, чтобы убедиться, что заказы клиентов обрабатываются правильно, и что уровни запасов обновляются правильно. Например, транзакция ACID выполняется, когда клиент покупает товар, чтобы обновить записи инвентаризации и гарантировать, что транзакция является атомарной, последовательной, изолированной и долговечной.
Альтернативы acid transactions
Существует несколько альтернатив транзакциям ACID, в том числе:
- BASE: расшифровывается как «в основном доступный, мягкое состояние, в конечном итоге согласованный». В отличие от транзакций ACID, в BASE немедленная согласованность обменивается на доступность и устойчивость к разбиению.
- Eventual Consistency (Эвентуальная согласованность): При конечной согласованности изменения данных распространяются асинхронно между репликами, что позволяет убедиться, что все реплики в конечном итоге согласуются с одним и тем же состоянием.
- Базы данных NoSQL: Базы данных NoSQL, такие как MongoDB или Cassandra, обычно не обеспечивают транзакций ACID, а вместо этого предлагают более слабый набор гарантий согласованности, которые все же могут обеспечить целостность данных.
- Базы данных NewSQL: Базы данных NewSQL, такие как VoltDB или CockroachDB, разработаны для обеспечения производительности и масштабируемости баз данных NoSQL, обеспечивая при этом транзакции, соответствующие ACID.
- Consensus Algorithms (Алгоритмы консенсуса): Алгоритмы консенсуса, такие как алгоритмы Raft или Paxos, могут быть использованы для координации распределенных систем таким образом, чтобы обеспечить согласованность и доступность.
В целом, существует множество способов достижения согласованности и надежности данных помимо ACID-транзакций, и выбор того или иного подхода зависит от конкретных потребностей системы.
Delta Lake: Надежные, согласованные данные с гарантиями ACID транзакций
Транзакции ACID уже давно являются одним из самых завидных свойств хранилищ данных, но теперь Delta Lake перенесла их в озера данных. Они позволяют пользователям видеть согласованные представления своих данных даже при записи новых данных в таблицу в режиме реального времени, поскольку каждая запись представляет собой изолированную транзакцию, которая записывается в упорядоченный журнал транзакций. [Delta Lake использует максимально возможный уровень изоляции (serializable isolation), обеспечивая последовательность и надежность чтения и записи в одну таблицу]. Реализуя ACID-транзакции, Delta Lake эффективно устраняет несколько ранее перечисленных критических замечаний к архитектуре Lambda: ее сложность, некорректное представление данных, а также необходимость доработки и переработки после неизбежных поломок конвейеров Lambda. Пользователи могут выполнять несколько параллельных транзакций над своими данными, и в случае ошибки в источнике данных или потоке Delta Lake отменяет выполнение транзакции, чтобы гарантировать, что данные останутся чистыми и неповрежденными. Прелесть транзакций ACID заключается в том, что пользователи могут доверять данным, хранящимся в Delta Lake. Аналитик данных, использующий таблицы Delta Lake для выполнения ETL над своими данными, чтобы подготовить их к работе с приборной панелью, может быть уверен, что KPI, которые он видит, отражают реальное состояние данных. Инженер машинного обучения, использующий таблицы Delta Lake для разработки функций, может быть на 100% уверен, что все его преобразования и агрегации либо выполняются точно так, как было задумано, либо не выполняются вообще (в этом случае он получит уведомление). Невозможно переоценить ценность уверенности в том, что мысленная модель ваших данных отражает их истинное базовое состояние.