У вирішенні конфліктів у вас є два варіанти:
- Ви можете спробувати уникнути конфлікту, і саме це робить песимістичне блокування.
- Або ви можете дозволити виникнення конфлікту, але вам потрібно виявити його, здійснюючи транзакції, і саме це робить Optimistic Locking.
Тепер розглянемо наступну аномалію втраченого оновлення :
Аномалія втраченого оновлення може трапитися в програмі " Читає" рівня ізоляції.
На діаграмі вище ми бачимо, що Аліса вірить, що вона може зняти з неї 40 account
але не усвідомлює, що Боб щойно змінив залишок на рахунку, і тепер у цьому обліковому записі залишилось лише 20.
Песимістичне блокування
Песимістичне блокування досягає цієї мети, використовуючи загальний чи прочитаний блокування в обліковому записі, щоб Бобі не вдалося змінити рахунок.
На наведеній діаграмі і Аліса, і Боб придбають блокування читання на account
рядку таблиці, яке читали обидва користувачі. База даних отримує ці блокування на SQL Server при використанні повторного читання або серіалізації.
Оскільки Аліса і Боб прочитали значення account
зі значенням ПК 1
, жоден з них не може змінити його, поки один користувач не звільнить блокування читання. Це пов’язано з тим, що операція запису вимагає отримання блоку запису / ексклюзивного блокування, а спільні / читані блокування запобігають блокуванню запису / ексклюзивності.
Лише після того, як Аліса здійснила транзакцію, і блокування читання було випущено на account
рядок, Боб UPDATE
відновить і застосує зміни. Поки Аліса не звільнить блокування читання, оновлення Боб блокує.
Щоб дізнатися більше про те, як рамки доступу до даних використовують песимістичну підтримку блокування певної бази даних, перегляньте цю статтю .
Оптимістичне блокування
Оптимістичне блокування дозволяє виникнути конфлікт, але виявляє його, застосовуючи оновлення Аліси як зміну версії.
Цього разу у нас є додаткова version
колонка. version
Стовпчика збільшується кожен раз , коли UPDATE або DELETE виконується, і він також використовується в реченні WHERE в UPDATE і DELETE заяви. Для цього нам потрібно видати SELECT і прочитати поточний version
перед виконанням UPDATE або DELETE, оскільки в іншому випадку ми б не знали, яке значення версії передавати до пункту WHERE або збільшувати.
Детальніше про те, як рамки доступу до даних реалізують оптимістичне блокування, ознайомтеся з цією статтею .
Операції на рівні додатків
Системи реляційних баз даних з'явилися в кінці 70-х - початку 80-х, коли клієнт, як правило, підключався до мейнфрейму через термінал. Ось чому ми все ще бачимо, як системи баз даних визначають такі терміни, як налаштування SESSION.
На сьогоднішній день через Інтернет ми більше не виконуємо читання та запис у контексті тієї самої транзакції бази даних, а ACID вже не є достатньою.
Наприклад, розглянемо такий випадок використання:
Без оптимістичного блокування немає жодного способу, як це втрачене оновлення було б спіймане, навіть якщо транзакції з базою даних використовували Serializable. Це відбувається тому, що читання та запис виконується в окремих HTTP-запитах, отже, в різних транзакціях бази даних.
Таким чином, оптимістичне блокування може допомогти вам запобігти втраченим оновленням навіть при використанні транзакцій на рівні додатків, які також включають час роздумів користувачів.
Щоб отримати докладніші відомості про рівні програми або логічні транзакції, ознайомтеся з цією статтею .
Висновок
Оптимістичне блокування - дуже корисна методика, і вона працює чудово навіть при використанні менш суворих рівнів ізоляції, як, наприклад, читання Здійснено, або коли читання і запис виконуються в наступних транзакціях з базою даних.
Недоліком оптимістичного блокування є те, що відкат буде спровоковано рамкою доступу до даних після лову OptimisticLockException
, тому втрачаючи всю роботу, яку ми виконували раніше під час виконання транзакції, що виконується в даний час.
Чим більше суперечок, тим більше конфліктів і тим більше шансів перервати транзакції. Зворотні звороти можуть бути дорогими для системи БД, оскільки вона потребує відновлення всіх поточних змін, що очікують на розгляд, які можуть включати як рядки таблиці, так і записи індексу.
З цієї причини песимістичне блокування може бути зручним, коли конфлікти трапляються часто, оскільки це зменшує ймовірність відхилення транзакцій.