Middle
19
Задача с конкурентным обновлением доски: как решить проблему потери обновлений (Lost Update) средствами БД?
Сұралған компаниялар
ИП Ганус Александр Андреевич
AI-дан жауап
sobes.tech AI
Проблема Lost Update возникает, когда два или более процесса одновременно читают и обновляют одни и те же данные, и одно обновление перезаписывает другое, теряя изменения.
Средства решения в БД:
-
Оптимистичная блокировка (Optimistic Locking)
- В таблицу добавляется поле версии (например,
versionилиupdated_at). - При обновлении проверяется, что версия не изменилась с момента чтения.
- Если версия изменилась, обновление отклоняется, и процесс повторяет операцию.
Пример на SQL:
UPDATE board SET content = :new_content, version = version + 1 WHERE id = :board_id AND version = :old_version; - В таблицу добавляется поле версии (например,
-
Пессимистическая блокировка (Pessimistic Locking)
- Использование SQL-запросов с блокировками, например
SELECT ... FOR UPDATE. - При чтении строки она блокируется для других транзакций до завершения текущей.
- Использование SQL-запросов с блокировками, например
-
Транзакции с уровнем изоляции SERIALIZABLE
- Обеспечивает последовательное выполнение транзакций.
- Может привести к блокировкам и снижению производительности.
Оптимистичная блокировка чаще предпочтительна для веб-приложений с высокой конкуренцией и низкой вероятностью конфликтов, так как она более масштабируема и менее блокирует ресурсы.