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

Когда выгоднее использовать Pessimistic lock

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

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

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

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

Зачем нужен Pessimistic lock

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

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

Pessimistic lock часто применяется в системах, где:

  • Высокая конкуренция за доступ к одним и тем же данным.
  • Критично избежать потери данных или неконсистентности.
  • Задержки, вызванные ожиданием блокировки, менее критичны, чем риск некорректных данных.

Как работает Pessimistic lock

Когда транзакция начинает работу с данными, она устанавливает блокировку, которая предотвращает доступ к этим данным другим транзакциям. Блокировка снимается только после завершения транзакции (успешного или неуспешного).

Пример кода

Рассмотрим пример использования Pessimistic lock в Java с использованием JPA (Java Persistence API):

import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.Persistence;
import javax.persistence.EntityTransaction;
​
public class PessimisticLockExample {
​
    public static void main(String[] args) {
        // Создаем EntityManager для управления сущностями
        EntityManager entityManager = Persistence.createEntityManagerFactory("example-unit").createEntityManager();
​
        // Начинаем транзакцию
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
​
        try {
            // Загружаем сущность с использованием Pessimistic lock
            // LockModeType.PESSIMISTIC_WRITE блокирует запись для других транзакций
            MyEntity entity = entityManager.find(MyEntity.class, 1L, LockModeType.PESSIMISTIC_WRITE);
​
            // Выполняем операции с сущностью
            entity.setValue("New Value");
​
            // Фиксируем транзакцию, снимая блокировку
            transaction.commit();
        } catch (Exception e) {
            // В случае ошибки откатываем транзакцию
            transaction.rollback();
        } finally {
            // Закрываем EntityManager
            entityManager.close();
        }
    }
}
  • EntityManager entityManager = Persistence.createEntityManagerFactory("example-unit").createEntityManager();: Создает EntityManager, который управляет жизненным циклом сущностей.
  • EntityTransaction transaction = entityManager.getTransaction();: Получает объект транзакции для управления началом и завершением транзакции.
  • transaction.begin();: Начинает транзакцию.
  • entityManager.find(MyEntity.class, 1L, LockModeType.PESSIMISTIC_WRITE);: Загружает сущность с идентификатором 1L и устанавливает Pessimistic lock, предотвращая другие транзакции от изменения этой сущности.
  • entity.setValue("New Value");: Изменяет значение сущности.
  • transaction.commit();: Фиксирует транзакцию, снимая блокировку.
  • transaction.rollback();: Откатывает транзакцию в случае ошибки.
  • entityManager.close();: Закрывает EntityManager, освобождая ресурсы.

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

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

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

Твои заметки