Чем отличается optimistic locking от pessimistic locking?
1️⃣ Как кратко ответить
Optimistic locking предполагает, что конфликтов при доступе к данным не будет, и проверяет наличие изменений только при сохранении. Pessimistic locking блокирует данные на время транзакции, предотвращая доступ других транзакций к этим данным.
2️⃣ Подробное объяснение темы
Optimistic locking и pessimistic locking — это два подхода к управлению конкурентным доступом к данным в системах, где несколько транзакций могут одновременно пытаться изменить одни и те же данные.
Optimistic Locking:
Optimistic locking исходит из предположения, что конфликтов при доступе к данным будет мало или не будет вовсе. Этот подход позволяет транзакциям работать с данными без блокировок, но при сохранении изменений проверяет, не изменились ли данные с момента их последнего чтения. Если данные изменились, транзакция отклоняется, и пользователь должен повторить операцию.
Пример использования optimistic locking:
- Чтение данных: Транзакция читает данные и запоминает их текущее состояние, например, с помощью версии или временной метки.
- Изменение данных: Транзакция вносит изменения в данные.
- Проверка и сохранение: Перед сохранением изменений система проверяет, не изменились ли данные с момента их последнего чтения. Если данные не изменились, изменения сохраняются. Если изменились, транзакция отклоняется.
// Пример кода на Java с использованием JPA (Java Persistence API)
@Entity
public class Product {
@Id
private Long id;
@Version
private Integer version; // Поле для хранения версии объекта
private String name;
private Double price;
// Геттеры и сеттеры
}
@Version: Аннотация, указывающая, что полеversionиспользуется для контроля версий. При каждом обновлении объекта версия увеличивается, что позволяет отслеживать изменения.
Pessimistic Locking:
Pessimistic locking предполагает, что конфликты при доступе к данным вероятны, и блокирует данные на время выполнения транзакции. Это предотвращает доступ других транзакций к заблокированным данным до завершения текущей транзакции.
Пример использования pessimistic locking:
- Чтение и блокировка данных: Транзакция читает данные и сразу же блокирует их, чтобы другие транзакции не могли их изменить.
- Изменение данных: Транзакция вносит изменения в данные.
- Сохранение и разблокировка: После завершения транзакции данные сохраняются, и блокировка снимается.
// Пример кода на Java с использованием JPA
EntityManager em = ...;
Product product = em.find(Product.class, productId, LockModeType.PESSIMISTIC_WRITE);
// Изменение данных
product.setPrice(newPrice);
// Сохранение изменений
em.getTransaction().commit();
LockModeType.PESSIMISTIC_WRITE: Указывает, что данные должны быть заблокированы для записи, предотвращая доступ других транзакций.
Применение и выбор подхода:
- Optimistic locking подходит для систем с низкой вероятностью конфликтов, где блокировки могут негативно сказаться на производительности.
- Pessimistic locking используется в системах с высокой вероятностью конфликтов, где важно предотвратить одновременные изменения данных.
Выбор между этими подходами зависит от характера приложения и требований к производительности и целостности данных.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться