Oleg Atamanenko

thoughts about programming

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

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

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

В конце 1970-х Джим Грей выделил следующие характеристики транзакций:

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

Непротиворечивость означает, что транзакция переводит базу данных из одного непротиворечивого состояния в другое непротиворечивое состояние. При этом, внутри транзакции база данных может находиться в противоречивом состоянии.

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

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

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

При параллельном выполнении нескольких транзакций могут возникнуть следующие проблемы:

Потерянное обновление может возникнуть в ситуации, когда две транзакции обновляют одни и те же данные.

“Грязное” чтение возникает, когда одна транзакция видит несохранённые изменения, сделанные другой транзакцией.

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

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

Стандарт 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невозможноневозможноневозможноневозможна