Назад к вопросам
Иннотех
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;
Выбор зависит от вероятности конфликтов и требований к производительности.