EMZETT.
Увійти

Оптимістичне та песимістичне блокування

Коротко: За песимістичного блокування дані блокують перед зміною, за оптимістичного лише під час збереження перевіряють, чи не змінив хтось щось у проміжку.

Докладніше: Обидва методи запобігають «втраченим оновленням», коли двоє редагують один запис і друге збереження затирає перше.

Подробиці

  • Песимістичне: SELECT ... FOR UPDATE блокує рядок до кінця транзакції. Надійно за високого конфлікту, але решті доводиться чекати, і загрожують взаємоблокування (deadlock).
  • Оптимістичне: У рядка є номер версії (або позначка часу). Під час збереження: UPDATE ... SET ..., version = version + 1 WHERE id = ? AND version = ?. Якщо змінено 0 рядків, хтось інший зберіг, і треба перезавантажити чи злити.
  • Веб: Користувач читає форму й зберігає за хвилини. Довгі блокування непрактичні, тому звичайне оптимістичне (ETag і If-Match у HTTP).
  • Вибір: Рідкісні конфлікти → оптимістичне, часті конфлікти на одних даних (залишок на складі, баланс рахунку) → песимістичне або атомарні оновлення (SET stock = stock - 1).
  • Контекст: Див. MVCC і рівні ізоляції.

Див. також: транзакції та ACID