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

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

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

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

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

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

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

  1. Чтение данных: Транзакция читает данные и сохраняет их текущее состояние, например, с помощью версии или временной метки.
  2. Изменение данных: Транзакция выполняет необходимые изменения в данных.
  3. Проверка на конфликт: Перед фиксацией изменений система проверяет, не изменились ли данные с момента их чтения. Это делается путем сравнения текущей версии данных с сохраненной.
  4. Фиксация или откат:
    • Если данные не изменились, транзакция успешно фиксируется.
    • Если данные изменились, транзакция откатывается, и изменения не применяются.

Пример использования

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

-- Предположим, у нас есть таблица с пользователями
CREATE TABLE Users (
    UserID INT PRIMARY KEY,
    UserName VARCHAR(100),
    Version INT
);
​
-- Транзакция 1: Чтение данных
BEGIN TRANSACTION;
SELECT UserName, Version FROM Users WHERE UserID = 1;
​
-- Транзакция 2: Изменение данных
BEGIN TRANSACTION;
UPDATE Users SET UserName = 'NewName', Version = Version + 1 WHERE UserID = 1;
COMMIT;
​
-- Транзакция 1: Попытка изменения данных
UPDATE Users SET UserName = 'AnotherName', Version = Version + 1 WHERE UserID = 1 AND Version = @OldVersion;
-- Если @OldVersion не совпадает с текущей версией, обновление не произойдет
IF @@ROWCOUNT = 0
BEGIN
    -- Конфликт обнаружен, откат транзакции
    ROLLBACK;
END
ELSE
BEGIN
    -- Изменения применены
    COMMIT;
END

Зачем это нужно

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

Применение

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

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

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

Твои заметки