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

Для решения проблем конкурентного доступа в СУБД введены такие понятия, как уровни изоляции.

Уровень изоляции – это степень защиты данных во время транзакции.

Каждый уровень защиты данных решает какую-то проблему.

Степень 1. READ UNCOMMITED.

Чтение данных незафиксированных транзакций.

При этом уровне изоляции СУБД позволяет считывать данные из таблиц, которые не зафиксированы. Например, если кто-то меняет суммы 10 000 документов в одной транзакции, что может занимать несколько минут, то в течение этого времени можно считать те изменения, которые уже сделаны, но еще не зафиксированы.

Но тем не менее СУБД контролирует сам момент записи. Другими словами, при этом уровне изоляции невозможно параллельно изменять одни и те же поля СУБД (в двух транзакциях), а только последовательно.

Такой уровень изоляции позволяет избежать проблемы:

  1. Потерянное обновление. Когда при одновременном изменении одних данных разными пользователями одно из изменений теряется.

Степень 2. READ COMMITED.

Чтение данных зафиксированных транзакций

При этом уровне изоляции СУБД позволяет читать только те данные, которые уже зафиксированы. Т.е. она контролирует, чтобы никто не мог читать данные, которые изменены, но еще не зафиксированы. Например, если кто-то меняет суммы 10 000 документов в одной транзакции, что может занимать несколько минут, то в течение этого времени невозможно считать те изменения, которые уже сделаны, но еще не зафиксированы.

Но если у вас активна транзакция и вы считываете данные из какой-то таблицы (но не меняете их), т.е. просто получаете информацию 2 раза в течение одной логической операции, то между 2 моментами чтения этих данных, кто-то может внести в них изменения. Это СУБД никак не контролирует.

Такой уровень изоляции позволяет избежать проблемы:

  1. Потерянное обновление. Когда при одновременном изменении одних данных разными пользователями одно из изменений теряется.
  2. Грязное чтение. Получение добавленных/измененных данных, но которые впоследствии отменятся.
Курс 1С: Эксперт. Уровни изоляции транзакций СУБД
Уровни изоляции СУБД

Степень 3. REPEATABLE READ.

Повторяемое чтение.

При этом уровне изоляции СУБД не позволяет изменять данные, если они были прочитаны активной транзакцией (не изменялись). Например, если кто-то меняет суммы 10 000 документов в одной транзакции, что может занимать несколько минут, то в течение этого времени невозможно считать (за исключением версионных СУБД, см. ниже) и изменить те данные, которые были просто прочитаны.

Скажем, при получении информации о документе, мы так же получаем признак контрагента «Покупатель/Поставщик», в зависимости от этого меняем суммы, таким образом, никто не сможет поменять тех контрагентов, признаки которых мы получили до тех пор, пока мы не закончим.

Таким образом, даже в конце транзакции (через несколько минут), если мы опять прочитаем признак «Покупатель/Поставщик» у контрагента, его значение будет тем же, что и в начале.

Такой уровень изоляции позволяет избежать проблемы:

  1. Потерянное обновление. Когда при одновременном изменении одних данных разными пользователями одно из изменений теряется.
  2. Грязное чтение. Получение добавленных/измененных данных, но которые впоследствии отменятся.
  3. Неповторяемое чтение. Когда при повторном чтении ранее прочитанные данные оказываются изменёнными.
Курс 1С: Эксперт. Уровни изоляции транзакций СУБД
Уровни изоляции СУБД

Степень 4. SERIALIZABLE.

Сериализуемый.

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

Например, у нас есть регистр сведений «Текущие остатки номенклатуры» с одним измерением «Номенклатура» и ресурсом «Остаток на всех складах». Если транзакция изменяет данные одной записи регистра сведений, то СУБД будет защищать строку данных с этой записью, а так же 2 соседние, чтобы рядом не могли добавить запись с таким же индексом (Номенклатура).

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

Такой уровень изоляции позволяет избежать проблемы:

  1. Потерянное обновление. Когда при одновременном изменении одних данных разными пользователями одно из изменений теряется.
  2. Грязное чтение. Получение добавленных/измененных данных, но которые впоследствии отменятся.
  3. Неповторяемое чтение. Когда при повторном чтении ранее прочитанные данные оказываются изменёнными.
  4. Фантомное чтение. Когда при повторном чтении, мы можем получать новые данные (при этом старые будут неизменны).
Курс 1С: Эксперт. Уровни изоляции транзакций СУБД
Сводная таблица уровней изоляции СУБД

Данная тема подробнее рассматривается в пакете видео-курса «Секреты 1С: Эксперта» Шаг 3. Занятие 09-01 .
Константин Ефимов | 1С: Эксперт. Фриланс, Бали.

КОНСТАНТИН ЕФИМОВ
Комментарии и вопросы