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

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

Ответ

Pessimistic Locking — это механизм, при котором СУБД физически блокирует доступ к конкретным данным (записям, строкам, диапазонам) для других транзакций на время выполнения текущей транзакции, предполагая конфликт.

Что блокируется:

  • Конкретные строки, выбранные с помощью SELECT ... FOR UPDATE (или аналогичного оператора).
  • Соответствующие индексные записи (в таких СУБД, как MySQL/InnoDB).
  • Возможность для других транзакций выполнять UPDATE, DELETE или SELECT ... FOR UPDATE на заблокированных данных — они будут ожидать снятия блокировки или завершения с таймаутом.

Пример в JPA (Hibernate):

EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
// Запрашиваем пессимистическую блокировку на запись для продукта с id=1
Product product = em.find(Product.class, 1L, LockModeType.PESSIMISTIC_WRITE);
product.setStock(product.getStock() - 1); // Операция изменения
// Другие транзакции, пытающиеся изменить эту же запись, будут заблокированы здесь
em.getTransaction().commit(); // Блокировка снимается

Ключевые последствия и best practices:

  • Риск взаимоблокировок (deadlock): Возникает, если несколько транзакций запрашивают блокировки в разном порядке. СУБД обычно обнаруживает и отменяет одну из них.
  • Влияние на производительность: Длительные транзакции с блокировками создают очереди и снижают пропускную способность.
  • Используйте осмотрительно: Применяйте для критических операций, где вероятность конфликта высока и его стоимость велика (например, списание последнего товара на складе). Для сценариев с редкими конфликтами предпочтительнее оптимистичная блокировка.