24 April, 2009

Транзакции в реляционных базах данных

При работе в многопользовательском окружении может возникнуть ситуация, когда разные пользователи или системы обновляют одни и те же данные. Это может привести к ситуации, когда один из пользователей изменит данные, которые уже изменял другой пользователь и приведёт либо к потере данных, либо к переводу данных в неконсистентное состояние. Для решения этой проблемы были придуманы транзакции. Целью транзакции является создание абстракции того, что каждый пользователь - единственный в системе.

Характеристики транзакций

В конце 1970-х Джим Грей выделил следующие характеристики транзакций:
  • Атомарность (Atomicity)
  • Непротиворечивость (Consistency)
  • Изолированность (Isolation)
  • Долговечность (Durability)
Атомарность означает, что все действия, производимые в рамках одной транзакции атомарны. Если транзакция заканчивается не успешно, то все изменения, сделанный в рамках этой транзакции откатываются назад. Если транзакция заканчивается успешно, то все её изменения сохраняются. Непротиворечивость означает, что транзакция переводит базу данных из одного непротиворечивого состояния в другое непротиворечивое состояние. При этом, внутри транзакции база данных может находиться в противоречивом состоянии. Изолированность означает, что во время работы одной транзакции ей недоступны изменения, происходящие в другой транзакции. Под долговечностью подразумевают, что после окончания транзакции все изменения, сделанные транзакцией фиксируется навсегда, то есть, если происходит программно-аппаратный сбой, то после восстановления системы в рабочее состояние нет потерянных изменений.

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

При параллельном выполнении нескольких транзакций могут возникнуть следующие проблемы:
  • Потерянное обновление
  • "Грязное" чтение
  • Неповторяющееся чтение
  • Фантомная вставка
Потерянное обновление может возникнуть в ситуации, когда две транзакции обновляют одни и те же данные. "Грязное" чтение возникает, когда одна транзакция видит несохранённые изменения, сделанные другой транзакцией. Неповторяющееся чтение - это ситуация, когда в рамках одной транзакции один и тот же запрос на выборку возвращает разные результаты. Фантомная вставка - ситуация, похожая на неповторяющее чтение - заключается в том, что результаты одной и той же выборки в рамках одной транзакции имеют разное количество возвращаемых строк. Стандарт SQL-92 определяет следующие уровни изоляции транзакции:
  1. READ_UNCOMMITED
  2. READ_COMMITED
  3. REPEATABLE_READ
  4. SERIALIZABLE
READ_UNCOMMITED - позволяет другим транзакциям видеть несохранённые изменения READ_COMMITED - транзакция во время выполенения видит только зафиксированные изменения. В большинстве баз данных это уровень изоляции по умолчанию. REPEATABLE_READ - данный уровень изоляции решает проблему неповторяющего чтения. SERIALIZABLE - данный уровень изоляции выполняет все транзакции последовательно. Это самый надёжный уровень изоляции, но, при этом, и наименее производительный. Каждый уровень решает часть вышеперечисленных проблем.
Проблема Уровень изоляции Потерянное обновление Грязное чтение Неповторяющееся чтение Фантомная вставка
READ_UNCOMMITED невозможно возможно возможно возможна
READ_COMMITED невозможно невозможно возможно возможна
REPEATABLE_READ невозможно невозможно невозможно возможна
SERIALIZABLE невозможно невозможно невозможно невозможна

No comments:

Post a Comment