Чому оптимістичне блокування швидше, ніж песимістичне блокування?


9

Обидві форми блокування змушують процес чекати правильної копії запису, якщо його зараз використовується інший процес. При песимістичному блокуванні механізм блокування походить від самої БД (власний об'єкт блокування), тоді як при оптимістичному блокуванні механізм блокування є деякою формою версії версій, як часова мітка, щоб перевірити, чи є запис "несвіжим" чи ні.

Але обидва викликають зависання 2-го процесу. Тому я запитую: чому оптимістичне блокування взагалі вважається швидшим / вищим, ніж песимістичне блокування? І чи є випадки використання, коли песимістична перевага віддається оптимістичній? Спасибі заздалегідь!


5
Дуже коротке пояснення існує в називанні. Оптимістичне блокування працює добре, коли шанс конфліктуючого блокування низький. Ми оптимістично налаштовані на взаємодію декількох процесів. Песимістичне блокування добре працює, коли шанс конфліктуючого блокування високий. Ми песимістично налаштовані на взаємодію декількох процесів. Обидва будуть виступати суб-оптимально там, де їх протилежність була б більш доречною.
Марк Сторі-Сміт

оптимістичне блокування може бути або не бути швидшим, ніж песимістичне блокування, залежно від вашої завантаженості.
АК

Відповіді:


8

Повторне запитання від:

/programming/129329/optimistic-vs-pessimistic-locking

Скопіюйте / вставте відповідь із наведеного вище посилання:

Оптимістичне блокування - це стратегія, коли ви читаєте запис, враховуєте номер версії та переконайтеся, що версія не змінилася перед тим, як записати запис назад. Коли ви пишете запис назад, ви фільтруєте оновлення на версію, щоб переконатися, що вона атомна. (тобто не оновлювався між періодами, коли ви перевіряєте версію і записуєте запис на диск) та оновлюєте версію одним зверненням.

Якщо запис забруднений (тобто інша ваша версія), ви перериваєте транзакцію, і користувач може її повторно запустити.

Ця стратегія найбільш застосовна для систем з високим обсягом і трирівневої архітектури, де вам не обов'язково підтримувати з'єднання з базою даних для вашого сеансу. У цій ситуації клієнт насправді не може підтримувати блокування баз даних, оскільки з'єднання взяті з пулу, і ви, можливо, не використовуєте одне і те ж з'єднання від одного доступу до іншого.

Песимістичне блокування - це коли ви блокуєте запис для виключного використання, поки не закінчите з ним. Він має набагато кращу цілісність, ніж оптимістичне блокування, але вимагає бути обережним з дизайном програми, щоб уникнути тупиків. Для використання песимістичного блокування вам потрібно або безпосередньо підключитись до бази даних (як це зазвичай відбувається у дворівневому застосуванні клієнтського сервера) або зовнішньо доступний ідентифікатор транзакції, який можна використовувати незалежно від з'єднання.

В останньому випадку ви відкриваєте транзакцію з TxID і потім знову підключаєтесь за допомогою цього ідентифікатора. СУБД підтримує блокування та дозволяє вибирати сеанс резервного копіювання через TxID. Ось так працюють розподілені транзакції за допомогою двофазних протоколів фіксації (наприклад, транзакцій XA або COM +).

Змінити (Додавання додаткової інформації для вирішення питання про ефективність):

Ефективність залежить від вашого оточення. Візьміть до уваги наступні фактори:

Ви знаєте, що оптимістично буде краще завдяки одночасності в більшості ситуацій. Залежно від RDBMS та середовища це може бути менш ефективним. Зазвичай при оптимістичному блокуванні ви виявите, що значення потрібно десь перетворювати на рядки.

Наприклад, з MS SQL Server він переміщується до TempDB, а в кінці стовпця додається щось між 12-14 байтами. Увімкнення оптимістичного блокування з рівнем ізоляції, таким як Snapshot Isolation, може спричинити фрагментацію, і ваш коефіцієнт заповнення потрібно буде скорегувати, оскільки рядки тепер мають додаткові дані в кінці, що може призвести до того, що сторінка буде майже повною, і це призведе до розбиття сторінки, яка знизиться. ваше виконання. Якщо ваш TempDB недостатньо оптимізований, це буде не так швидко.

Тож я думаю, що контрольний список такий:

  • -У вас є достатньо IO / ресурсів для обробки форми версій версій? Якщо ні, то ви додаєте накладні витрати. Якщо так, то якщо ви читаєте дані часто, поки ви часто блокуєте їх для запису, ви помітите гарне поліпшення одночасності в режимі читання і запису (хоча запис все ще блокує запис, читання більше не блокує запис і навпаки)
  • -Чи ваш код чутливий до тупиків або у вас виникає блокування? Якщо ви не відчуваєте довгих блокувань або багато тупиків, то додаткові накладні витрати оптимістичного блокування не призведуть до того, що все буде швидше, звичайно, у більшості випадків ми тут говоримо мілісекунди.
  • -Якщо ваша база даних велика (або на обмеженому рівні обладнання), і ваші сторінки даних майже наповнені, залежно від RDBMS, ви можете викликати розбиття основних сторінок і фрагментацію даних, тому обов'язково врахуйте переіндексацію після включення.

Це мої думки з цього питання, відкриті для того, щоб почути більше від громади.


Дякую @Ali Razeghi (+1) - Я думаю, що dba.se є більш підходящим місцем для цього питання. Крім того, хоча це чудова відповідь, вона не відповідає на моє питання про ефективність (коли один швидший, ніж інший). Знову дякую!
Мара

Привіт Мара, це хороший момент. Я розширив відповідь. Дякую.
Алі Разегі

11

Ви неправильно розумієте оптимістичне блокування.

Оптимістичне блокування не змушує транзакцій чекати один одного.

Оптимістичне блокування, можливо, спричиняє збій транзакції, але це робиться без жодного "блокування". І якщо транзакція не вдається через оптимістичне блокування, користувачеві потрібно починати все заново. Слово "оптиміст" випливає саме з того, що умова, яка спричиняє збій транзакцій саме з цієї причини, відбуватиметься лише дуже винятково. "Оптимістичне" блокування - це підхід, який говорить: "Я не буду робити фактичні замки, тому що я сподіваюся, що вони все одно не знадобляться. Якщо виявиться, що я помилявся в цьому, я прийму неминучий збій".


1

Оптимістичне блокування, як правило, швидше, оскільки фактично не відбувається блокування з точки зору бази даних. Цілком залежить від програми, чи слід поважати стовпець версії (чи псевдоколонку, як-от ora_rowscn) чи ні. Зазвичай у вас є багато додатків, підключених до однієї бази даних, тому db стає спільним ресурсом, і якщо він зависне, всі клієнти будуть зачеплені.

З оптимістичною стратегією блокування "вивішування" відбувається на стороні клієнта і не впливає на інших.

Однак, якщо запис часто оновлюється, ви можете в кінцевому підсумку перечитувати його занадто багато разів (у випадку оптимістичного блокування), тим самим позбавляючи переваг оптимістичної стратегії.

Я не погодився б у перевазі будь-якого підходу; їх обох можна зловживати. Песимістична більш схильна до помилок лише тому, що вона небезпечніша: блокування відбувається на рівні db, залежить від RDMS, можливо, ви не маєте контролю над тим, що заблоковано (ескалація блокування), вам потрібно подбати про замовлення блокування вручну.


Цікавий момент a1ex07, оптимітичне блокування все ще включає блокування, однак, як запис завжди буде блокувати інші записи, правильно?
Алі Разегі

Ні, це не так. Ось чому це "швидше".
Ервін Смоут

Це може бути справа і для Oracle, але і для MS SQL Server, оскільки він за замовчуванням використовує рівень ізоляції "читання", оптимістичне блокування дозволить одночасно працювати читачам та письменницьким потокам, але запис записуватиме блокування запису, поки не заповниться блокуючий потік.
Алі Разегі

@Ali Razeghi: Я не впевнений, що я дотримуюся вашої точки зору. У SQLServer з присвяченими читанням письменники блокують читачів за замовчуванням, якщо не увімкнено "READ_COMMITTED_SNAPSHOT". Оптимістичне блокування - це не блокування ресурсу db (рядок / сторінка / таблиця), а скоріше якась угода між усіма програмами, які використовують базу даних, щоб не оновлювати запис, якщо версія не відповідає очікуваній.
a1ex07

1
@Eamon Nerbonne: Я говорив про те, що "письменники не блокують читачів" ... Де ви бачили, що я згадую про "письменники блокуйте / не блокуйте письменників"?
a1ex07

0

Оптимістичне блокування передбачає, що одночасні транзакції можуть завершуватися, не впливаючи один на одного. Таким чином, оптимістичне блокування відбувається швидше, оскільки жодні блокування не виконуються під час здійснення транзакцій. Це запобігання не викликати проблем з одночасністю, а не вилікувати. Транзакція просто перевіряє (три способи набори даних, тип даних типу Timestamp, перевірка старого та нового значення), дані, які жодна інша транзакція не змінила дані. У разі модифікації транзакція повертається назад.

Песимістичне блокування передбачає, що паралельні транзакції будуть конфліктувати між собою, тому він вимагає блокування, це робиться шляхом визначення рівня ІЗОЛЯЦІЇ (Читати неприйнято, Читати здійснене, Повторне читання та серіалізацію) управління транзакціями. замки служать для захисту спільних ресурсів або об'єктів (таблиці, рядки даних, блоки даних, кешовані елементи, з'єднання та цілі системи). У нас є багато типів замків як спільні блокування, блокування оновлень, блокування вставки, ексклюзивні блокування, блокування транзакцій, блокування DML, схеми блокування та блоки резервного відновлення.

щоб отримати більше уявлення


-3

Неправильно говорити, що песимістичне блокування відбувається повільніше, ніж оптимістичне, або говорити, що оптимістичне швидше. Один класичний запит для демонстрації цього неприйнятного способу мислення - це зробити агрегат на різних RDBMS, наприклад:

SELECT COUNT(*) FROM atable

Ви побачите, що в RDBMS, який підтримує оригінальний оптимістичний підхід, час, який займає цей запит, значно значніший, ніж у тих, хто має песимістичний вихід

Наприклад, на моєму ПК цей же запит займає 27 мс на SQL сервері та 109 на PostGreSQL ...

Додаткові накладні витрати, необхідні для читання мертвих версій рядків MVCC і не рахують записів привидів у сукупності, додають додаткових витрат, які песимістичні не мають!


4
Підхід до управління паралельністю СУБД є ортогональним для оптимістичного / песимістичного блокування, а порівняння часу виконання запитів у двох різних СУБД вводить в оману.
мустаччо

Оскільки SQL Server здатний виконати два режими блокування, ви можете легко порівняти це, зробивши справжній показник у підході до одночасності користувача.
користувач7370003
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.