Sobes.tech
Back to questions
Senior
6

Что такое оптимистическая блокировка?

Companies where asked
Lenta Tech

Answer from AI

sobes.tech AI

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

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

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

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

  • В базе данных в таблице есть поле version (число).
  • Клиент читает запись с version=1.
  • Клиент пытается обновить запись, указывая в условии WHERE version=1.
  • Если в базе версия уже стала 2, обновление не выполнится, и клиент узнает о конфликте.

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

Пример на Go (упрощённо):

type Record struct {
    ID      int
    Data    string
    Version int
}

func UpdateRecord(r *Record, newData string) error {
    // Читаем текущую версию из БД
    currentVersion := getVersionFromDB(r.ID)
    if currentVersion != r.Version {
        return errors.New("конфликт обновления")
    }
    // Обновляем данные и увеличиваем версию
    r.Data = newData
    r.Version++
    // Пытаемся сохранить с условием версии
    err := updateInDB(r)
    if err != nil {
        return err
    }
    return nil
}

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