Sobes.tech
Назад к вопросам
Middle+
3

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

Компании, где спрашивали
ИннотехИннотех

Ответ от нейросети

sobes.tech AI

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

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

Реализация:

  • Оптимистичная блокировка часто реализуется с помощью версии данных или временной метки. Например, в базе данных добавляют поле version. При обновлении проверяют, совпадает ли версия, если нет — откат.
// пример оптимистичной блокировки с версией
@Transactional
public void updateEntity(Entity e) {
  Entity current = repository.findById(e.getId());
  if (!current.getVersion().equals(e.getVersion())) {
    throw new OptimisticLockException();
  }
  e.setVersion(e.getVersion() + 1);
  repository.save(e);
}
  • Пессимистичная блокировка реализуется через блокировки на уровне базы данных или в коде (synchronized, Lock). Например, в Java:
Lock lock = new ReentrantLock();
lock.lock();
try {
  // работа с ресурсом
} finally {
  lock.unlock();
}

Или в SQL:

SELECT * FROM table WHERE id = ? FOR UPDATE;

Выбор зависит от вероятности конфликтов и требований к производительности.