Стани гонитви та TOCTOU: коли таймінг стає вразливістю
Коротко: Стан гонитви виникає, коли результат залежить від випадкового таймінгу паралельних процесів; за «перевірив — використав» (TOCTOU) стан може змінитися між кроками, наприклад із купонами, переказами чи файлами.
Докладніше: Коли два запити читають і змінюють одні й ті самі дані одночасно, результат може стати хибним. Це помилка паралелізму і водночас вразливість, якщо вона підриває правила (купон використано двічі, подвійна виплата).
Подробиці
Приклад: використання купона
Запит A: читає купон (не використаний) Запит B: читає купон (не використаний)
Запит A: позначає як використаний Запит B: позначає як використанийОбидва проходять успішно. Рішення: атомарні операції, блокування й транзакції бази даних.
Див. також: транзакції БД і ACID, м’ютекс, взаємне блокування, обмеження частоти