Oleg Atamanenko
При работе в многопользовательском окружении может возникнуть ситуация, когда разные пользователи или системы обновляют одни и те же данные. Это может привести к ситуации, когда один из пользователей изменит данные, которые уже изменял другой пользователь и приведёт либо к потере данных, либо к переводу данных в неконсистентное состояние. Для решения этой проблемы были придуманы транзакции. Целью транзакции является создание абстракции того, что каждый пользователь - единственный в системе.
В конце 1970-х Джим Грей выделил следующие характеристики транзакций:
Атомарность означает, что все действия, производимые в рамках одной транзакции атомарны. Если транзакция заканчивается не успешно, то все изменения, сделанный в рамках этой транзакции откатываются назад. Если транзакция заканчивается успешно, то все её изменения сохраняются.
Непротиворечивость означает, что транзакция переводит базу данных из одного непротиворечивого состояния в другое непротиворечивое состояние. При этом, внутри транзакции база данных может находиться в противоречивом состоянии.
Изолированность означает, что во время работы одной транзакции ей недоступны (с поправками на уровень изоляции) изменения, происходящие в другой транзакции.
Под долговечностью подразумевают, что после окончания транзакции все изменения, сделанные транзакцией фиксируется навсегда, то есть, если происходит программно-аппаратный сбой, то после восстановления системы в рабочее состояние нет потерянных изменений.
При параллельном выполнении нескольких транзакций могут возникнуть следующие проблемы:
Потерянное обновление может возникнуть в ситуации, когда две транзакции обновляют одни и те же данные.
“Грязное” чтение возникает, когда одна транзакция видит несохранённые изменения, сделанные другой транзакцией.
Неповторяющееся чтение - это ситуация, когда в рамках одной транзакции один и тот же запрос на выборку возвращает разные результаты.
Фантомная вставка - ситуация, похожая на неповторяющее чтение - заключается в том, что результаты одной и той же выборки в рамках одной транзакции имеют разное количество возвращаемых строк.
Стандарт SQL-92 определяет следующие уровни изоляции транзакции:
READ_UNCOMMITED - позволяет другим транзакциям видеть несохранённые изменения
READ_COMMITED — транзакция во время выполенения видит только зафиксированные изменения. В большинстве баз данных это уровень изоляции по умолчанию.
REPEATABLE_READ — данный уровень изоляции решает проблему неповторяющего чтения.
SERIALIZABLE - данный уровень изоляции выполняет все транзакции последовательно. Это самый надёжный уровень изоляции, но, при этом, и наименее производительный.
Каждый уровень решает часть вышеперечисленных проблем.
Проблема Уровень изоляции | Потерянное обновление | Грязное чтение | Неповторяющееся чтение | Фантомная вставка |
---|---|---|---|---|
READ_UNCOMMITED | невозможно | возможно | возможно | возможна |
READ_COMMITED | невозможно | невозможно | возможно | возможна |
REPEATABLE_READ | невозможно | невозможно | невозможно | возможна |
SERIALIZABLE | невозможно | невозможно | невозможно | невозможна |