Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: JPA, locking, optimistic locking, pessimistic locking, database concurrency

Какие виды блокировок существуют в JPA?

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

Короткий ответ

В JPA существует два основных вида блокировок: оптимистическая и пессимистическая. Оптимистическая блокировка предполагает, что конфликты редки, и проверяет версию записи только при коммите транзакции. Пессимистическая блокировка явно блокирует запись в базе данных на время транзакции, предотвращая её изменение другими пользователями. Выбор типа блокировки зависит от частоты конфликтов и требований к производительности.

Длинный ответ

JPA (Java Persistence API) предоставляет механизмы для управления одновременным доступом к одним и тем же данным, что предотвращает потерю обновлений и обеспечивает согласованность. Основная идея — контролировать, как несколько транзакций взаимодействуют с одной сущностью.

Оптимистическая блокировка (Optimistic Locking)

Этот подход основан на предположении, что конфликты при одновременном обновлении данных случаются редко. Вместо физической блокировки строки в базе, он использует поле версии (обычно аннотированное @Version). При каждом обновлении сущности значение версии увеличивается. Перед сохранением изменений JPA проверяет, не изменилась ли версия с момента чтения сущности. Если версия отличается, выбрасывается исключение OptimisticLockException.

@Entity
public class Product {
    @Id
    private Long id;
    private String name;
    @Version
    private Long version; // Поле для оптимистической блокировки
    // геттеры и сеттеры
}

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

Пессимистическая блокировка (Pessimistic Locking)

Этот подход предполагает, что конфликты вероятны, и заранее блокирует запись для других транзакций. Блокировка устанавливается на уровне базы данных при чтении сущности и удерживается до конца текущей транзакции. В JPA её можно применить с помощью метода EntityManager.lock() или указания LockModeType в запросе.

// Блокировка сущности при поиске
Product product = em.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);

// Или блокировка уже загруженной сущности
em.lock(product, LockModeType.PESSIMISTIC_WRITE);

Основные типы пессимистических блокировок: PESSIMISTIC_READ (разделяемая блокировка, другие могут читать, но не изменять) и PESSIMISTIC_WRITE (эксклюзивная блокировка, другие не могут ни читать, ни изменять, в зависимости от СУБД). Применяется в критических операциях, где целостность данных важнее производительности, например, при списании остатков на складе или финансовых транзакциях.

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Java

    Java

  • Spring

    Spring

Ключевые слова

#JPA

#locking

#optimistic locking

#pessimistic locking

#database concurrency

Подпишись на Java Developer в телеграм