← Назад ко всем вопросам

Что такое Pessimistic Locking в Spring

1️⃣ Как кратко ответить

Pessimistic Locking в Spring — это механизм управления конкурентным доступом к данным в базе данных, который блокирует запись или чтение данных другими транзакциями до завершения текущей транзакции. Это предотвращает проблемы, связанные с одновременным доступом, такие как "грязное" чтение или потеря обновлений.

2️⃣ Подробное объяснение темы

Pessimistic Locking — это стратегия управления конкурентным доступом к данным, которая предполагает, что конфликт при доступе к данным вероятен, и поэтому блокирует данные, чтобы предотвратить такие конфликты. В контексте Spring и JPA (Java Persistence API), Pessimistic Locking используется для обеспечения целостности данных в многопользовательской среде.

Зачем это нужно

В многопользовательских системах, где несколько транзакций могут одновременно пытаться читать и изменять одни и те же данные, возникает риск конфликтов. Например, если две транзакции одновременно читают и изменяют одну и ту же запись, это может привести к потере данных или некорректным результатам. Pessimistic Locking предотвращает такие ситуации, блокируя доступ к данным для других транзакций до тех пор, пока текущая транзакция не завершится.

Как это работает

Pessimistic Locking в JPA и Spring реализуется с помощью аннотаций и методов, которые указывают, как именно должны блокироваться данные. Основные типы блокировок:

  • PESSIMISTIC_READ: Блокирует данные для записи, но позволяет другим транзакциям читать данные. Это полезно, когда нужно предотвратить изменения данных, но чтение остается безопасным.
  • PESSIMISTIC_WRITE: Блокирует данные как для чтения, так и для записи. Это гарантирует, что ни одна другая транзакция не сможет ни читать, ни изменять данные, пока текущая транзакция не завершится.

Пример использования

Рассмотрим пример использования Pessimistic Locking в Spring с JPA:

import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
​
@Repository
public class ProductRepository {
​
    @PersistenceContext
    private EntityManager entityManager;
​
    @Transactional
    public Product findProductWithPessimisticLock(Long productId) {
        // Используем PESSIMISTIC_WRITE для блокировки записи
        // Это гарантирует, что другие транзакции не смогут ни читать, ни изменять эту запись
        return entityManager.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
    }
}
  • @PersistenceContext: Аннотация, которая указывает, что EntityManager должен быть внедрен в этот компонент. EntityManager используется для взаимодействия с контекстом персистентности.
  • @Transactional: Аннотация, которая указывает, что метод должен выполняться в рамках транзакции. Это необходимо для обеспечения атомарности операций.
  • entityManager.find(...): Метод, который используется для поиска сущности по ее идентификатору. Здесь мы указываем LockModeType.PESSIMISTIC_WRITE, чтобы применить блокировку записи.

Где применяется

Pessimistic Locking применяется в системах, где целостность данных критична и где вероятность конфликтов высока. Это может быть полезно в финансовых приложениях, системах управления запасами и других областях, где важно предотвратить потерю данных и обеспечить корректность операций.

Тема: Многопоточность
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки