В БД
Вирішується транзакціями з відповідним рівнем ізоляції або SELECT ... FOR UPDATE — блокування рядка до кінця транзакції.
В кеші
Атомарні операції Redis (INCR, SETNX, Lua-скрипти) запобігають гонці на рівні кешу.
Оптимістичне vs песимістичне блокування
- Оптимістичне — при записі перевіряємо, чи змінились дані з моменту читання (version number / CAS). Немає блокувань, але можливий retry
- Песимістичне — блокуємо ресурс при читанні, щоб ніхто не змінив. Без retry, але знижує паралелізм