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