← Назад ко всем вопросам

Что такое оптимистичные блокировки

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Принцип работы

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

  2. Изменение данных: Пользователь вносит изменения в данные локально, не блокируя их в базе данных.

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

  4. Фиксация изменений: Если данные не изменились, изменения фиксируются. Если данные были изменены другим пользователем, операция отклоняется, и пользователь должен повторить попытку.

Пример кода

Рассмотрим пример использования оптимистичных блокировок в 1С:

Процедура ОбновитьДанные(Знач Данные)
    // Получаем текущую версию данных из базы
    ТекущаяВерсия = ПолучитьТекущуюВерсию(Данные.Код);
​
    // Проверяем, совпадает ли версия данных
    Если Данные.Версия <> ТекущаяВерсия Тогда
        // Если версии не совпадают, значит данные были изменены
        ВызватьИсключение "Данные были изменены другим пользователем. Повторите попытку.";
    КонецЕсли;
​
    // Обновляем данные в базе
    ОбновитьДанныеВБазе(Данные);
КонецПроцедуры
  • ПолучитьТекущуюВерсию(Данные.Код): Функция, которая возвращает текущую версию данных из базы данных. Это может быть временная метка или номер версии записи.

  • Если Данные.Версия <> ТекущаяВерсия Тогда: Проверка на наличие конфликта. Если версия данных, с которой работает пользователь, не совпадает с текущей версией в базе, значит, данные были изменены другим пользователем.

  • ВызватьИсключение: Если обнаружен конфликт, вызывается исключение, информирующее пользователя о необходимости повторить попытку.

  • ОбновитьДанныеВБазе(Данные): Процедура, которая обновляет данные в базе данных, если конфликтов не обнаружено.

Применение

Оптимистичные блокировки эффективны в системах с высокой степенью параллелизма и низкой вероятностью конфликтов, таких как системы управления контентом или приложения для совместной работы. Они позволяют улучшить производительность за счет уменьшения времени блокировки данных и увеличения доступности системы для пользователей.

Тема: Транзакции и блокировки
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки