Назад к вопросам
Middle+
168
questionbank

В чем отличие между оптимистичной и пессимистичной блокировкой в Hibernate?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Основные отличия:

Характеристика Оптимистичная блокировка Пессимистичная блокировка
Когда происходит блокировка При попытке сохранить измененный объект. Используется механизм версионирования (поле версии или метка времени). При загрузке объекта из базы данных. Используется блокировка на уровне БД (SELECT ... FOR UPDATE).
Вероятность конфликта Низкая. Высокая.
Производительность Выше в случае редких конфликтов, так как нет накладных расходов на блокировку БД. Ниже в случае частых конфликтов или длительных транзакций из-за блокировки ресурсов БД.
Применение Когда транзакции короткие и вероятность одновременного изменения одних и тех же данных низкая. Когда вероятность одновременного изменения одних и тех же ресурсов высокая и требуется гарантированная эксклюзивность доступа.
Тип блокировки Логическая (на уровне приложения, посредством версионирования). Физическая (на уровне базы данных).

Пример оптимистичной блокировки с использованием поля версии:

// entities.User.java
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Version // hibernate добавит проверку версии при обновлении
    private int version;

    // ... getters and setters
}

Пример пессимистичной блокировки при загрузке:

// dao.UserRepository.java
public User findByIdWithPessimisticWriteLock(Long id) {
    return entityManager.find(User.class, id, LockModeType.PESSIMISTIC_WRITE);
}