Что такое Optimistic lock
1️⃣ Как кратко ответить
Optimistic lock — это стратегия управления конкурентным доступом к данным, при которой предполагается, что конфликтов не будет. Проверка на наличие изменений в данных выполняется только при фиксации транзакции. Если данные изменились, транзакция откатывается.
2️⃣ Подробное объяснение темы
Optimistic lock (оптимистическая блокировка) — это подход к управлению конкурентным доступом к данным в многопользовательских системах. В отличие от пессимистической блокировки, где данные блокируются на время выполнения транзакции, оптимистическая блокировка предполагает, что конфликты между транзакциями будут редкими.
Как это работает
При использовании оптимистической блокировки данные не блокируются на время транзакции. Вместо этого, при чтении данных сохраняется их текущее состояние, например, с помощью версии или контрольной суммы. Когда транзакция готова к фиксации, система проверяет, изменилось ли состояние данных с момента их чтения. Если данные не изменились, транзакция успешно фиксируется. Если данные изменились, транзакция откатывается, и пользователь может повторить попытку.
Пример использования
Рассмотрим пример с базой данных, где у нас есть таблица Product с полями id, name, price и version. Поле version используется для отслеживания изменений.
@Entity
public class Product {
@Id
private Long id;
private String name;
private Double price;
@Version
private Integer version;
// Getters and setters
}
@Entity— аннотация, указывающая, что класс является сущностью JPA.@Id— аннотация, обозначающая первичный ключ.@Version— аннотация, используемая для реализации оптимистической блокировки. Полеversionавтоматически увеличивается при каждом обновлении записи.
Процесс обновления
- Чтение данных: Пользователь A читает продукт с
id = 1. В это времяversion = 1. - Изменение данных: Пользователь A изменяет
priceпродукта. - Параллельное изменение: Пользователь B также читает тот же продукт и изменяет его
name. - Фиксация транзакции: Пользователь A пытается сохранить изменения. Hibernate проверяет
version. Еслиversionне изменился, транзакция фиксируется, иversionувеличивается до 2. - Конфликт: Пользователь B пытается сохранить свои изменения. Hibernate видит, что
versionизменился с 1 на 2, и откатывает транзакцию пользователя B.
Зачем это нужно
Optimistic lock полезен в системах, где конфликты редки, и блокировка данных на время транзакции может привести к значительным задержкам. Это позволяет повысить производительность и масштабируемость системы, так как транзакции могут выполняться параллельно без необходимости блокировки ресурсов.
Применение
Optimistic lock часто используется в веб-приложениях, где пользователи редко изменяют одни и те же данные одновременно. Это также полезно в распределенных системах, где блокировка ресурсов может быть сложной и дорогостоящей.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться