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

Чем отличается optimistic locking от pessimistic locking?

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

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

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

Optimistic locking и pessimistic locking — это два подхода к управлению конкурентным доступом к данным в системах, где несколько транзакций могут одновременно пытаться изменить одни и те же данные.

Optimistic Locking:

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

Пример использования optimistic locking:

  1. Чтение данных: Транзакция читает данные и запоминает их текущее состояние, например, с помощью версии или временной метки.
  2. Изменение данных: Транзакция вносит изменения в данные.
  3. Проверка и сохранение: Перед сохранением изменений система проверяет, не изменились ли данные с момента их последнего чтения. Если данные не изменились, изменения сохраняются. Если изменились, транзакция отклоняется.
// Пример кода на 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:

  1. Чтение и блокировка данных: Транзакция читает данные и сразу же блокирует их, чтобы другие транзакции не могли их изменить.
  2. Изменение данных: Транзакция вносит изменения в данные.
  3. Сохранение и разблокировка: После завершения транзакции данные сохраняются, и блокировка снимается.
// Пример кода на 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 используется в системах с высокой вероятностью конфликтов, где важно предотвратить одновременные изменения данных.

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

Тема: Базы данных и SQL
Стадия: Tech

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

Твои заметки