Транзакция (информатика)

Поделись знанием:
Перейти к: навигация, поиск

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

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





Пример транзакции

Пример: необходимо перевести с банковского счёта номер 5 на счёт номер 7 сумму в 10 денежных единиц. Этого можно достичь, к примеру, приведённой последовательностью действий:

  • Начать транзакцию
прочесть баланс на счету номер 5
уменьшить баланс на 10 денежных единиц
сохранить новый баланс счёта номер 5
прочесть баланс на счету номер 7
увеличить баланс на 10 денежных единиц
сохранить новый баланс счёта номер 7
  • Окончить транзакцию

Эти действия представляют собой логическую единицу работы «перевод суммы между счетами», и таким образом, являются транзакцией. Если прервать данную транзакцию, к примеру, в середине, и не аннулировать все изменения, легко оставить владельца счёта номер 5 без 10 единиц, тогда как владелец счета номер 7 их не получит.

Свойства транзакций

Одним из наиболее распространённых наборов требований к транзакциям и транзакционным системам является набор ACID (Atomicity, Consistency, Isolation, Durability). Требования ACID были в основном сформулированы в конце 70-х годов Джимом Греем[1]. Вместе с тем существуют специализированные системы с ослабленными транзакционными свойствами[2].

Уровни изоляции транзакций

В идеале транзакции разных пользователей должны выполняться так, чтобы создавалась иллюзия, что пользователь текущей транзакции — единственный. Однако в реальности, по соображениям производительности и для выполнения некоторых специальных задач, СУБД предоставляют различные уровни изоляции транзакций.

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

  • 0 — Чтение неподтверждённых данных (грязное чтение) (Read Uncommitted, Dirty Read) — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения (lost changes), возможны неповторяемое чтение и фантомы.
  • 1 — Чтение подтверждённых данных (Read Committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы.
  • 2 — Повторяемое чтение (Repeatable Read, Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы.
  • 3 — Сериализуемый (Serializable) — сериализуемые транзакции. Результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают.

Чем выше уровень изоляции, тем больше требуется ресурсов, чтобы его обеспечить. Соответственно, повышение изолированности может приводить к снижению скорости выполнения параллельных транзакций, что является «платой» за повышение надёжности.

В СУБД уровень изоляции транзакций можно выбрать как для всех транзакций сразу, так и для одной конкретной транзакции. По умолчанию в большинстве баз данных используется уровень 1 (Read Committed). Уровень 0 используется в основном для отслеживания изменений длительных транзакций или для чтения редко изменяемых данных. Уровни 2 и 3 используются при повышенных требованиях к изолированности транзакций.

Реализация

Полноценная реализация уровней изоляции и свойств ACID представляет собой нетривиальную задачу. Обработка поступающих данных приводит к большому количеству маленьких изменений, включая обновление как самих таблиц, так и индексов. Эти изменения потенциально могут потерпеть неудачу: закончилось место на диске, операция занимает слишком много времени (timeout) и т. д. Система должна в случае неудачи корректно вернуть базу данных в состояние до транзакции.

Первые коммерческие СУБД (к примеру, IBM DB2), пользовались исключительно блокировкой доступа к данным для обеспечения свойств ACID. Но большое количество блокировок приводит к существенному уменьшению производительности. Есть два популярных семейства решений этой проблемы, которые снижают количество блокировок:

В обоих случаях блокировки должны быть расставлены на всю информацию, которая обновляется. В зависимости от уровня изоляции и имплементации, блокировки записи также расставляются на информацию, которая была прочитана транзакцией.

При упреждающей журнализации, используемой в Sybase и MS SQL Server до версии 2005, все изменения записываются в журнал, и только после успешного завершения — в базу данных. Это позволяет СУБД вернуться в рабочее состояние после неожиданного падения системы. Теневые страницы содержат копии тех страниц базы данных на начало транзакции, в которых происходят изменения. Эти копии активизируются после успешного завершения. Хотя теневые страницы легче реализуются, упреждающая журнализация более эффективна[4].

Дальнейшее развитие технологий управления базами данных привело к появлению безблокировочных технологий. Идея контроля над параллельным доступом с помощью временных меток (timestamp-based concurrency control) была развита и привела к появлению многоверсионной архитектуры MVCC. Эти технологии не нуждаются ни в журнализации изменений, ни в теневых страницах. Архитектура, реализованная в Oracle 7.х и выше, записывает старые версии страниц в специальный сегмент отката, но они все ещё доступны для чтения. Если транзакция при чтении попадает на страницу, временная метка которой новее начала чтения, данные берутся из сегмента отката (то есть используется «старая» версия). Для поддержки такой работы ведётся журнал транзакций, но в отличие от «упреждающей журнализации», он не содержит данных. Работа с ним состоит из трёх логических шагов:

  1. Записать намерение произвести некоторые операции
  2. Выполнить задание, копируя оригиналы изменяемых страниц в сегмент отката
  3. Записать, что всё сделано без ошибок

Журнал транзакций в сочетании с сегментом отката (область, в которой хранится копия всех изменяемых в ходе транзакции данных) гарантирует целостность данных. В случае сбоя запускается процедура восстановления, которая просматривает отдельные его записи следующим образом:

  • Если повреждена запись, то сбой произошёл во время проставления отметки в журнале. Значит, ничего важного не потерялось, игнорируем эту ошибку.
  • Если все записи помечены как успешно выполненные, то сбой произошёл между транзакциями, здесь также нет потерь.
  • Если в журнале есть незавершённая транзакция, то сбой произошёл во время записи на диск. В этом случае мы восстанавливаем старую версию данных из сегмента отката.

Firebird вообще не имеет ни журнала изменений, ни сегмента отката, а реализует MVCC, записывая новые версии строк таблиц прямо в активное пространство данных. Так же поступает MS SQL 2005. Теоретически это даёт максимальную эффективность при параллельной работе с данными, но ценой является необходимость «сборки мусора», то есть удаления старых и уже не нужных версий данных.

См. также

В Викисловаре есть статья «транзакция»

Напишите отзыв о статье "Транзакция (информатика)"

Примечания

  1. [research.microsoft.com/~gray/papers/theTransactionConcept.pdf Gray, Jim. The Transaction Concept: Virtues and Limitations. Proceedings of the 7th International Conference on Very Large Databases: pages 144—154, 1981] (англ.)
  2. [www.informatik.uni-trier.de/~ley/db/books/collections/JajodiaK97.html Advanced Transaction Models and Architectures] (англ.)
  3. [zeus.sai.msu.ru:7000/database/articles/aries/ Семейство алгоритмов ARIES]
  4. Gray, J., McJones, P., Blasgen, M., Lindsay, B., Lorie, R., Price, T., Putzolu, F., and Traiger, I. The recovery manager of the System R database manager. ACM Comput. Surv. 13, 2 (June 1981).

Отрывок, характеризующий Транзакция (информатика)

Уже было поздно, когда он встал, запечатав письмо. Ему хотелось спать, но он знал, что не заснет и что самые дурные мысли приходят ему в постели. Он кликнул Тихона и пошел с ним по комнатам, чтобы сказать ему, где стлать постель на нынешнюю ночь. Он ходил, примеривая каждый уголок.
Везде ему казалось нехорошо, но хуже всего был привычный диван в кабинете. Диван этот был страшен ему, вероятно по тяжелым мыслям, которые он передумал, лежа на нем. Нигде не было хорошо, но все таки лучше всех был уголок в диванной за фортепиано: он никогда еще не спал тут.
Тихон принес с официантом постель и стал уставлять.
– Не так, не так! – закричал князь и сам подвинул на четверть подальше от угла, и потом опять поближе.
«Ну, наконец все переделал, теперь отдохну», – подумал князь и предоставил Тихону раздевать себя.
Досадливо морщась от усилий, которые нужно было делать, чтобы снять кафтан и панталоны, князь разделся, тяжело опустился на кровать и как будто задумался, презрительно глядя на свои желтые, иссохшие ноги. Он не задумался, а он медлил перед предстоявшим ему трудом поднять эти ноги и передвинуться на кровати. «Ох, как тяжело! Ох, хоть бы поскорее, поскорее кончились эти труды, и вы бы отпустили меня! – думал он. Он сделал, поджав губы, в двадцатый раз это усилие и лег. Но едва он лег, как вдруг вся постель равномерно заходила под ним вперед и назад, как будто тяжело дыша и толкаясь. Это бывало с ним почти каждую ночь. Он открыл закрывшиеся было глаза.
– Нет спокоя, проклятые! – проворчал он с гневом на кого то. «Да, да, еще что то важное было, очень что то важное я приберег себе на ночь в постели. Задвижки? Нет, про это сказал. Нет, что то такое, что то в гостиной было. Княжна Марья что то врала. Десаль что то – дурак этот – говорил. В кармане что то – не вспомню».
– Тишка! Об чем за обедом говорили?
– Об князе, Михайле…
– Молчи, молчи. – Князь захлопал рукой по столу. – Да! Знаю, письмо князя Андрея. Княжна Марья читала. Десаль что то про Витебск говорил. Теперь прочту.
Он велел достать письмо из кармана и придвинуть к кровати столик с лимонадом и витушкой – восковой свечкой и, надев очки, стал читать. Тут только в тишине ночи, при слабом свете из под зеленого колпака, он, прочтя письмо, в первый раз на мгновение понял его значение.
«Французы в Витебске, через четыре перехода они могут быть у Смоленска; может, они уже там».
– Тишка! – Тихон вскочил. – Нет, не надо, не надо! – прокричал он.
Он спрятал письмо под подсвечник и закрыл глаза. И ему представился Дунай, светлый полдень, камыши, русский лагерь, и он входит, он, молодой генерал, без одной морщины на лице, бодрый, веселый, румяный, в расписной шатер Потемкина, и жгучее чувство зависти к любимцу, столь же сильное, как и тогда, волнует его. И он вспоминает все те слова, которые сказаны были тогда при первом Свидании с Потемкиным. И ему представляется с желтизною в жирном лице невысокая, толстая женщина – матушка императрица, ее улыбки, слова, когда она в первый раз, обласкав, приняла его, и вспоминается ее же лицо на катафалке и то столкновение с Зубовым, которое было тогда при ее гробе за право подходить к ее руке.
«Ах, скорее, скорее вернуться к тому времени, и чтобы теперешнее все кончилось поскорее, поскорее, чтобы оставили они меня в покое!»


Лысые Горы, именье князя Николая Андреича Болконского, находились в шестидесяти верстах от Смоленска, позади его, и в трех верстах от Московской дороги.
В тот же вечер, как князь отдавал приказания Алпатычу, Десаль, потребовав у княжны Марьи свидания, сообщил ей, что так как князь не совсем здоров и не принимает никаких мер для своей безопасности, а по письму князя Андрея видно, что пребывание в Лысых Горах небезопасно, то он почтительно советует ей самой написать с Алпатычем письмо к начальнику губернии в Смоленск с просьбой уведомить ее о положении дел и о мере опасности, которой подвергаются Лысые Горы. Десаль написал для княжны Марьи письмо к губернатору, которое она подписала, и письмо это было отдано Алпатычу с приказанием подать его губернатору и, в случае опасности, возвратиться как можно скорее.
Получив все приказания, Алпатыч, провожаемый домашними, в белой пуховой шляпе (княжеский подарок), с палкой, так же как князь, вышел садиться в кожаную кибиточку, заложенную тройкой сытых саврасых.
Колокольчик был подвязан, и бубенчики заложены бумажками. Князь никому не позволял в Лысых Горах ездить с колокольчиком. Но Алпатыч любил колокольчики и бубенчики в дальней дороге. Придворные Алпатыча, земский, конторщик, кухарка – черная, белая, две старухи, мальчик казачок, кучера и разные дворовые провожали его.
Дочь укладывала за спину и под него ситцевые пуховые подушки. Свояченица старушка тайком сунула узелок. Один из кучеров подсадил его под руку.
– Ну, ну, бабьи сборы! Бабы, бабы! – пыхтя, проговорил скороговоркой Алпатыч точно так, как говорил князь, и сел в кибиточку. Отдав последние приказания о работах земскому и в этом уж не подражая князю, Алпатыч снял с лысой головы шляпу и перекрестился троекратно.
– Вы, ежели что… вы вернитесь, Яков Алпатыч; ради Христа, нас пожалей, – прокричала ему жена, намекавшая на слухи о войне и неприятеле.
– Бабы, бабы, бабьи сборы, – проговорил Алпатыч про себя и поехал, оглядывая вокруг себя поля, где с пожелтевшей рожью, где с густым, еще зеленым овсом, где еще черные, которые только начинали двоить. Алпатыч ехал, любуясь на редкостный урожай ярового в нынешнем году, приглядываясь к полоскам ржаных пелей, на которых кое где начинали зажинать, и делал свои хозяйственные соображения о посеве и уборке и о том, не забыто ли какое княжеское приказание.
Два раза покормив дорогой, к вечеру 4 го августа Алпатыч приехал в город.
По дороге Алпатыч встречал и обгонял обозы и войска. Подъезжая к Смоленску, он слышал дальние выстрелы, но звуки эти не поразили его. Сильнее всего поразило его то, что, приближаясь к Смоленску, он видел прекрасное поле овса, которое какие то солдаты косили, очевидно, на корм и по которому стояли лагерем; это обстоятельство поразило Алпатыча, но он скоро забыл его, думая о своем деле.
Все интересы жизни Алпатыча уже более тридцати лет были ограничены одной волей князя, и он никогда не выходил из этого круга. Все, что не касалось до исполнения приказаний князя, не только не интересовало его, но не существовало для Алпатыча.
Алпатыч, приехав вечером 4 го августа в Смоленск, остановился за Днепром, в Гаченском предместье, на постоялом дворе, у дворника Ферапонтова, у которого он уже тридцать лет имел привычку останавливаться. Ферапонтов двенадцать лет тому назад, с легкой руки Алпатыча, купив рощу у князя, начал торговать и теперь имел дом, постоялый двор и мучную лавку в губернии. Ферапонтов был толстый, черный, красный сорокалетний мужик, с толстыми губами, с толстой шишкой носом, такими же шишками над черными, нахмуренными бровями и толстым брюхом.
Ферапонтов, в жилете, в ситцевой рубахе, стоял у лавки, выходившей на улицу. Увидав Алпатыча, он подошел к нему.
– Добро пожаловать, Яков Алпатыч. Народ из города, а ты в город, – сказал хозяин.
– Что ж так, из города? – сказал Алпатыч.
– И я говорю, – народ глуп. Всё француза боятся.
– Бабьи толки, бабьи толки! – проговорил Алпатыч.
– Так то и я сужу, Яков Алпатыч. Я говорю, приказ есть, что не пустят его, – значит, верно. Да и мужики по три рубля с подводы просят – креста на них нет!
Яков Алпатыч невнимательно слушал. Он потребовал самовар и сена лошадям и, напившись чаю, лег спать.
Всю ночь мимо постоялого двора двигались на улице войска. На другой день Алпатыч надел камзол, который он надевал только в городе, и пошел по делам. Утро было солнечное, и с восьми часов было уже жарко. Дорогой день для уборки хлеба, как думал Алпатыч. За городом с раннего утра слышались выстрелы.
С восьми часов к ружейным выстрелам присоединилась пушечная пальба. На улицах было много народу, куда то спешащего, много солдат, но так же, как и всегда, ездили извозчики, купцы стояли у лавок и в церквах шла служба. Алпатыч прошел в лавки, в присутственные места, на почту и к губернатору. В присутственных местах, в лавках, на почте все говорили о войске, о неприятеле, который уже напал на город; все спрашивали друг друга, что делать, и все старались успокоивать друг друга.