Что такое пессимистическая блокировка (Pessimistic Locking) в Spring Data JPA?

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

Ответ

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

Реализация в Spring Data JPA:

  1. Использование аннотации @Lock:

    import org.springframework.data.jpa.repository.Lock;
    import javax.persistence.LockModeType;
    
    @Repository
    public interface AccountRepository extends JpaRepository<Account, Long> {
        @Lock(LockModeType.PESSIMISTIC_WRITE) // Блокировка на запись
        @Query("SELECT a FROM Account a WHERE a.id = :id")
        Account findByIdForUpdate(@Param("id") Long id);
    }
    • PESSIMISTIC_WRITE: Блокировка для обновления/удаления (обычно SELECT ... FOR UPDATE в SQL).
    • PESSIMISTIC_READ: Блокировка только для чтения, если БД поддерживает.
  2. Использование EntityManager:

    Account account = entityManager.find(Account.class, accountId, LockModeType.PESSIMISTIC_WRITE);

Как это работает в SQL (на примере PostgreSQL):

-- Spring Data JPA сгенерирует примерно такой запрос:
BEGIN;
SELECT * FROM account WHERE id = 123 FOR UPDATE; -- Строка блокируется
-- ... бизнес-логика, изменяющая account ...
UPDATE account SET balance = 1000 WHERE id = 123;
COMMIT; -- Блокировка снимается
Плюсы и минусы: Плюсы Минусы
Гарантирует целостность данных в высококонкурентных сценариях. Высокий риск взаимных блокировок (deadlocks).
Простая концепция. Снижает пропускную способность (производительность).
Требует коротких транзакций.

Область применения: Финансовые операции (списание/зачисление), бронирование, управление инвентарём — где строгая согласованность критична.