Открыть сервис

Transaction

Transaction (от англ. transaction — сделка, операция) — это логически завершённая и неделимая операция или последовательность операций над данными, которая переводит систему из одного целостного состояния в другое. В информатике и теории баз данных транзакция является основной единицей работы, обеспечивающей согласованность и надёжность хранения информации, особенно в многопользовательских и распределённых системах. В более широком смысле термин используется в экономике, финансах и праве для обозначения любой сделки или обмена ценностями.

История

Понятие транзакции возникло в 1960-х годах с развитием первых систем управления базами данных (СУБД). Необходимость в атомарных операциях была вызвана потребностью обрабатывать финансовые и банковские операции, где ошибка или частичное выполнение могли привести к колоссальным убыткам. Первые коммерческие СУБД, такие как IMS (IBM) и IDMS (Cullinet), уже поддерживали базовые механизмы транзакций.

В 1970-х годах, с появлением реляционной модели данных Эдгара Кодда, концепция транзакции была формализована. В 1983 году Андреас Ройтер и Тео Хердер ввели аббревиатуру ACID (Atomicity, Consistency, Isolation, Durability), ставшую золотым стандартом для свойств транзакций. Развитие распределённых систем в 1990-х и 2000-х годах привело к появлению распределённых транзакций (например, протокол двухфазной фиксации — 2PC) и альтернативных моделей, таких как BASE (Basically Available, Soft state, Eventually consistent), используемых в NoSQL-базах данных.

Свойства ACID

Для обеспечения надёжности транзакция должна удовлетворять четырём свойствам, известным как ACID:

  • Атомарность (Atomicity) — транзакция выполняется полностью или не выполняется вовсе. Если какой-либо шаг внутри транзакции завершается неудачей, все предыдущие изменения откатываются (rollback). Система возвращается в состояние, предшествовавшее началу транзакции.
  • Согласованность (Consistency) — транзакция переводит базу данных из одного непротиворечивого состояния в другое. Все ограничения целостности (ключи, типы данных, бизнес-правила) должны быть соблюдены как до, так и после выполнения транзакции.
  • Изоляция (Isolation) — результаты выполнения параллельных транзакций не должны влиять друг на друга. Каждая транзакция должна выполняться так, как если бы она была единственной в системе. На практике для обеспечения изоляции используются различные уровни изоляции (Read Uncommitted, Read Committed, Repeatable Read, Serializable), которые определяют, какие аномалии (грязное чтение, неповторяющееся чтение, фантомное чтение) допустимы.
  • Долговечность (Durability) — после успешного завершения (commit) транзакции все её изменения становятся постоянными и сохраняются даже в случае сбоя системы (отключения питания, аппаратной ошибки). Обычно обеспечивается записью на энергонезависимые носители (журнал транзакций).

Типы транзакций

Транзакции классифицируются по различным признакам:

По объёму и структуре

  • Плоские (простые) — состоят из одной последовательности операций. Наиболее распространённый тип.
  • Вложенные — содержат внутри себя другие транзакции (подтранзакции). Вложенная транзакция может быть отменена независимо от внешней.
  • Цепочные — последовательность транзакций, где следующая начинается автоматически после завершения предыдущей. Откат возможен только к предыдущей точке фиксации, а не к началу всей цепочки.

По среде выполнения

  • Локальные — выполняются в рамках одного соединения с одной базой данных.
  • Распределённые — затрагивают несколько баз данных, серверов или узлов сети. Требуют координации между участниками (например, через протокол двухфазной фиксации или трёхфазной фиксации).

По характеру операций

  • Транзакции чтения — только извлекают данные, не изменяя их.
  • Транзакции записи — изменяют, добавляют или удаляют данные.

Уровни изоляции

Стандарт SQL определяет четыре уровня изоляции транзакций, которые позволяют балансировать между производительностью и согласованностью данных:

Уровень изоляцииГрязное чтениеНеповторяющееся чтениеФантомное чтение
Read UncommittedДопускаетсяДопускаетсяДопускается
Read CommittedИсключаетсяДопускаетсяДопускается
Repeatable ReadИсключаетсяИсключаетсяДопускается
SerializableИсключаетсяИсключаетсяИсключается
  • Грязное чтение — чтение данных, которые были изменены, но ещё не зафиксированы другой транзакцией.
  • Неповторяющееся чтение — ситуация, когда при повторном чтении одной и той же строки в рамках одной транзакции данные оказываются различными из-за изменений, внесённых и зафиксированных другой транзакцией.
  • Фантомное чтение — при повторном выполнении запроса в рамках одной транзакции возвращается разный набор строк (появляются новые строки, добавленные другой транзакцией).

Механизмы реализации

Для обеспечения свойств ACID СУБД используют несколько ключевых механизмов:

  • Журнал транзакций (transaction log) — последовательная запись всех изменений, позволяющая выполнить откат (undo) или повтор (redo) операций после сбоя.
  • Блокировки (locks) — механизм, предотвращающий одновременный доступ к одним и тем же данным. Различают разделяемые (shared) блокировки для чтения и исключительные (exclusive) блокировки для записи.
  • Версионирование (MVCCMulti-Version Concurrency Control) — вместо блокировок создаётся несколько версий строки данных, что позволяет читателям видеть согласованное состояние на момент начала транзакции, не блокируя писателей.
  • Точки сохранения (savepoints) — промежуточные точки внутри транзакции, до которых можно выполнить частичный откат без отмены всей транзакции.

Применение

Транзакции являются фундаментальной концепцией для множества областей:

  • Банковские системы — перевод денег между счетами, где списание с одного счёта и зачисление на другой должны быть выполнены атомарно.
  • Электронная коммерция — оформление заказа, включающее списание средств, резервирование товара и обновление остатков на складе.
  • Системы бронирования — авиабилеты, гостиницы, где одновременное бронирование одного и того же места двумя пользователями должно быть исключено.
  • Управление базами данных — любая операция вставки, обновления или удаления данных в реляционных СУБД (PostgreSQL, MySQL, Oracle Database, Microsoft SQL Server) по умолчанию выполняется в рамках транзакции.
  • Распределённые реестры (блокчейн) — каждая новая запись (блок) является транзакцией, которая добавляется в цепочку только после подтверждения консенсусом сети.

Критика и альтернативы

Строгое соблюдение ACID в распределённых системах может приводить к снижению производительности и доступности, особенно при большом количестве узлов. В качестве альтернативы была предложена модель BASE (Basically Available, Soft state, Eventually consistent), которая допускает временную несогласованность данных в обмен на высокую доступность и масштабируемость. BASE используется в NoSQL-системах (Cassandra, CouchDB, Riak) и некоторых веб-сервисах.

Также существуют распределённые транзакции с использованием саг (saga) — последовательности локальных транзакций, каждая из которых имеет компенсирующее действие для отката. Саги не требуют глобальной блокировки и лучше подходят для микросервисной архитектуры.

Источники

  • Gray, J., & Reuter, A. (1993). Transaction Processing: Concepts and Techniques. Morgan Kaufmann.
  • Date, C. J. (2003). An Introduction to Database Systems (8th ed.). Addison-Wesley.
  • Garcia-Molina, H., Ullman, J. D., & Widom, J. (2008). Database Systems: The Complete Book (2nd ed.). Pearson.
  • Таненбаум, Э., ван Стеен, М. (2012). Распределённые системы. Принципы и парадигмы. Питер.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →