Ответ
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): Возникает, если несколько транзакций запрашивают блокировки в разном порядке. СУБД обычно обнаруживает и отменяет одну из них.
- Влияние на производительность: Длительные транзакции с блокировками создают очереди и снижают пропускную способность.
- Используйте осмотрительно: Применяйте для критических операций, где вероятность конфликта высока и его стоимость велика (например, списание последнего товара на складе). Для сценариев с редкими конфликтами предпочтительнее оптимистичная блокировка.