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) блокировки для записи.
- Версионирование (MVCC — Multi-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 →