@@ -52,16 +52,17 @@ COMMIT;
52
52
53
53
## Ожидаемые ответы
54
54
1 . Возможна проблема “Lost Update” (потерянное обновление)
55
- Клиент A уменьшает stock = 5 - 3 = 2, но клиент B видит старое значение stock = 5 и выполняет stock = 5 - 4 = 1.
56
- В итоге вместо 2 единиц на складе остается -1 (ошибка)!
55
+ - Клиент A уменьшает stock = 5 - 3 = 2, но клиент B видит старое значение stock = 5 и выполняет stock = 5 - 4 = 1.
56
+ - В итоге вместо 2 единиц на складе остается -1 (ошибка)!
57
57
2 . В зависимости от уровня изоляции возможны аномалии:
58
- READ UNCOMMITTED / READ COMMITTED – клиент B видит “устаревшие” данные, что приводит к ошибке.
59
- REPEATABLE READ – клиент B не сможет увидеть обновленный stock клиента A, но проблема не решается полностью.
60
- SERIALIZABLE – запросы будут выполняться по очереди, исключая проблему.
61
- 3 . Как избежать проблемы:
62
- Использовать SELECT ... FOR UPDATE
63
- Применять уровень изоляции SERIALIZABLE или REPEATABLE READ
64
- Оптимистичные блокировки (проверка stock перед UPDATE)
65
- 4 . Лучший уровень изоляции:
66
- Если конкуренция высокая → SELECT ... FOR UPDATE + REPEATABLE READ
67
- Если важна строгость → SERIALIZABLE (но возможны блокировки)
58
+ - READ UNCOMMITTED / READ COMMITTED – клиент B видит “устаревшие” данные, что приводит к ошибке.
59
+ - REPEATABLE READ – клиент B не сможет увидеть обновленный stock клиента A, но проблема не решается полностью.
60
+ - SERIALIZABLE – запросы будут выполняться по очереди, исключая проблему.
61
+ 4 . Как избежать проблемы:
62
+ - Использовать SELECT ... FOR UPDATE
63
+ - Применять уровень изоляции SERIALIZABLE или REPEATABLE READ
64
+ - Оптимистичные блокировки (проверка stock перед UPDATE)
65
+ 5 . Лучший уровень изоляции:
66
+ - Если конкуренция высокая → SELECT ... FOR UPDATE + REPEATABLE READ
67
+ - Если важна строгость → SERIALIZABLE (но возможны блокировки)
68
+
0 commit comments