Транзакция
Материал из Википедии — свободной энциклопедии
Транза́кция (англ. transaction) — в информатике, группа последовательных операций, которая представляет из себя логическую единицу работы с данными. Транзакция может быть выполнена целиком либо успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создается история транзакций.
Следующий пример позволит понять основные понятия в данной статье. Необходимо перевести с банковского счета номер 5 на счет номер 7 сумму в 10 денежных единиц. Этого можно достичь, к примеру, приведенной последовательностью действий:
Начать транзакцию прочесть баланс на счету номер 5 уменьшить баланс на 10 денежных единиц сохранить новый баланс счета номер 5 прочесть баланс на счету номер 7 увеличить баланс на 10 денежных единиц сохранить новый баланс счета номер 7 Окончить транзакцию
Эти действия представляют из себя логическую единицу работы "перевод суммы между счетами", и таким образом, являются транзакцией. Если прервать данную транзакцию, к примеру, в середине, и не аннулировать все изменения, легко оставить владельца счета номер 5 без 10 единиц, тогда как владелец счета номер 7 их не получит.
Различают обычные и распределённые транзакции. Распределённые транзакции подразумевают использование больше чем одной транзакционной системы и требуют намного более сложной логики (например, two-phase commit — двухфазный протокол подтверждения успеха). Также, в некоторых системах реализованы автономные транзакции, или под-транзакции, которые являются автономной частью родительской транзакции.
Обычно транзакции базируются на свойствах атомарности, непротиворечивости, изоляции и долговечности (см. ACID) и наиболее распространены в СУБД. В идеале транзакции разных пользователей должны выполняться так, чтобы создавалась иллюзия, что пользователь текущей транзакции — единственный. Однако, в реальности, по соображениям производительности и для выполнения некоторых специальных задач, СУБД предоставляют различные уровни изоляции транзакций.
Содержание |
[править] Уровни изоляции транзакций
Уровни описаны в порядке увеличения изоляции транзакций и надёжности работы с данными
- 0 — Read Uncommited (Dirty Read) — чтение незафиксированных изменений своей транзакции и конкурирующих транзакций, возможны нечистые, неповторяемые чтения и фантомы
- 1 — Read Commited — чтение всех изменений своей транзакции и зафиксированных изменений конкурирующих транзакций, нечистые чтения невозможны, возможны неповторяемые чтения и фантомы
- 2 — Repeatable Read (Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые конкурирующими транзакциями после начала своей недоступны, нечистые и неповторяемые чтения невозможны, возможны фантомы
- 3 — Serializable — cериализуемые транзакции, то есть транзакции, результат действия которых не зависит от порядка выполнения шагов транзакции (запрещено чтение всех данных изменённых с начала транзакции, в том числе и своей транзакцией)
Чем выше уровень изоляции, тем больше требуется ресурсов, чтобы их поддерживать.
Чаще всего используется уровень 1 (Read Commited). Уровень 0 используется в основном для отслеживания изменений длительных транзакций. Уровень 2 — это то самое (теоретическое) понимание изоляции транзакций. Уровень 3 удобен для оптимизаторов СУБД.
[править] Свойства serializable транзакций[1]
- Транзакция неделима в том смысле, что представляет собой единое целое. Все ее компоненты либо имеют место, либо нет. Не бывает частичной транзакции. Если может быть выполнена лишь часть транзакции, она отклоняется.
- Транзакция является согласованной, потому что не нарушает бизнес-логику и отношения между элементами данных. Это свойство очень важно при разработке клиент-серверных систем, поскольку в хранилище данных поступает большое количество транзакций от разных систем и объектов. Если хотя бы одна из них нарушит целостность данных, то все остальные могут выдать неверные результаты.
- Транзакция всегда изолированна, поскольку ее результаты самодостаточны. Они не зависят от предыдущих или последующих транзакций – это свойство называется сериализуемостью и означает, что транзакции в последовательности независимы.
- Транзакция устойчива. После своего завершения она сохраняется в системе, которую ничто не может вернуть в исходное (до начала транзакции) состояние, т.е. происходит фиксация транзакции, означающая, что ее действие постоянно даже при сбое системы. При этом подразумевается некая форма хранения информации в постоянной памяти как часть транзакции.
[править] Журнал транзакций
Одним из возможных способов реализации транзакционных систем является ведение журнала транзакций. Журнал транзакций — это структура данных транзакционной системы, в которой хранятся записи о планирующихся операциях. Работа с ним состоит из трёх шагов:
- Записать намерение произвести некоторые операции
- Выполнить задание
- Записать, что всё сделано без ошибок
Журнал транзакций в сочетании с сегментом отката (область, в которой хранится копия всех изменяемых в ходе транзакции данных) гарантирует целостность данных. В случае сбоя запускается процедура восстановления, которая просматривает отдельные его записи следующим образом:
- Если повреждена запись, то сбой произошёл во время проставления отметки в журнале. Значит, ничего важного не потерялось, игнорируем эту ошибку.
- Если все записи помечены как успешно выполненные, то сбой произошёл между транзакциями, здесь также нет потерь.
- Если в журнале есть незавершённая транзакция, то сбой произошёл во время записи на диск. В этом случае мы восстанавливаем старую версию данных из сегмента отката.
Следует заметить, что данный механизм как правило используется в серверах с блокировочной структурой, т.к. многоверсионная архитектура сама по себе представляет своеобразную реализацию такого лога, и потому теоретически не требует восстановительных операций после сбоя.
[править] См. также
СУБД | ||
Концепции (Edgar Codd, Christopher Date, ...)
|
||
Реализации систем управления базами данных | ||
|