Sobes.tech
Senior
16

Расскажите про оптимистическую и пессимистическую блокировки. Чем они отличаются?

Companies where asked
А7

Answer from AI

sobes.tech AI

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

  • Пессимистическая блокировка предполагает, что конфликт доступа вероятен, поэтому ресурс блокируется на время работы с ним. Другие потоки или транзакции ждут освобождения блокировки. Это классический подход с mutex, lock и т.п.

  • Оптимистическая блокировка предполагает, что конфликты редки. Вместо блокировки данные читаются и изменяются без блокировок, а при сохранении проверяется, не изменились ли данные с момента чтения (например, по версии или timestamp). Если данные изменились, операция откатывается или повторяется.

Отличия:

Характеристика Пессимистическая блокировка Оптимистическая блокировка
Предположение Конфликты вероятны Конфликты редки
Механизм Блокировка ресурса Проверка версии/состояния при записи
Производительность Может снижаться из-за ожидания Лучше при низкой конкуренции
Применение Высококонкурентные операции Низкоконкурентные операции

Пример оптимистической блокировки в Go:

type Record struct {
    Version int
    Data    string
}

func UpdateRecord(r *Record, newData string) error {
    oldVersion := r.Version
    // ... читаем данные, изменяем ...
    r.Data = newData
    r.Version++
    // При сохранении проверяем, что версия не изменилась
    if !CompareAndSwapVersion(oldVersion, r.Version) {
        return errors.New("конфликт обновления")
    }
    return nil
}

Таким образом, выбор зависит от характера нагрузки и требований к согласованности.