Транзакция

Транза́кция (англ. 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 удобен для оптимизаторов СУБД.

Журнал транзакций

Одним из возможных способов реализации транзакционных систем является ведение журнала транзакций. Журнал транзакций — это структура данных транзакционной системы, в которой хранятся записи о планирующихся операциях. Работа с ним состоит из трёх шагов:

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

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

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

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

См. также

СУБД

Концепции (Edgar Codd, Christopher Date, ...)
База данных | Database model | Реляционные базы данных | Реляционная модель данных | Реляционная алгебра | Первичный ключ - Внешний ключ - Суррогатный ключ - Superkey
Нормальная форма | Ссылочная целостность | Реляционные СУБД | Распределённые СУБД | ACID

Объекты
Триггер (Trigger) | Представление (View) | Таблица (Table) | Курсор (Cursor) | Лог транзакций | Транзакция | Индекс | Хранимая процедура | Partition

SQL (DCL, DDL, DML)
SELECT | INSERT | UPDATE | MERGE | DELETE | JOIN | UNION | CREATE | ALTER | DROP
Сравнение синтаксисов

Реализации систем управления базами данных

Типы реализаций
Flat file | Deductive | Dimensional | Иерархическая | Объектно-ориентированная | Temporal


Свободные системы
Firebird | Ingres | Kexi | MySQL | SQLite

Компоненты
Язык запросов | Оптимизатор запросов | План выполнения запроса | ODBC | JDBC

 
Начальная страница  » 
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 Home