Что такое пессимистическая блокировка (Pessimistic Locking) в базах данных?

«Что такое пессимистическая блокировка (Pessimistic Locking) в базах данных?» — вопрос из категории Базы данных, который задают на 27% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Пессимистическая блокировка — это стратегия управления параллельным доступом, которая предполагает, что конфликты при изменении данных вероятны. Она предварительно блокирует запись (или строку) на уровне БД на время транзакции, предотвращая её изменение другими транзакциями.

Как работает: При чтении данных с намерением их обновления транзакция устанавливает блокировку (например, SELECT ... FOR UPDATE). Другие транзакции, пытающиеся получить такую же блокировку, будут ждать её освобождения или получат таймаут.

Пример в JPA (Java Persistence API):

EntityManager em = ...;
em.getTransaction().begin();
// Блокируем сущность для обновления
Product product = em.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
product.setStock(product.getStock() - 1); // Безопасное изменение
em.getTransaction().commit(); // Блокировка снимается

Плюсы:

  • Гарантирует целостность данных в условиях высокой конкуренции.
  • Предотвращает «потерю обновлений».

Минусы:

  • Снижает производительность и масштабируемость из-за ожиданий.
  • Повышает риск взаимных блокировок (deadlock).

Когда использовать: В системах, где данные часто конфликтуют (например, бронирование последнего билета, финансовые операции). Альтернатива – оптимистическая блокировка (с версиями), которая эффективнее при редких конфликтах.