Ответ
Пессимистическая блокировка (Pessimistic Locking) — это стратегия управления параллельным доступом, при которой предполагается высокий риск конфликта. Сущность блокируется на уровне базы данных в момент чтения и удерживается до конца транзакции, предотвращая её модификацию другими транзакциями.
Реализация в Spring Data JPA:
-
Использование аннотации
@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: Блокировка только для чтения, если БД поддерживает.
-
Использование
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). | |
| Простая концепция. | Снижает пропускную способность (производительность). | |
| Требует коротких транзакций. |
Область применения: Финансовые операции (списание/зачисление), бронирование, управление инвентарём — где строгая согласованность критична.