Sobes.tech
Middle
19

Задача с конкурентным обновлением доски: как решить проблему потери обновлений (Lost Update) средствами БД?

Сұралған компаниялар
ИП Ганус Александр Андреевич

AI-дан жауап

sobes.tech AI

Проблема Lost Update возникает, когда два или более процесса одновременно читают и обновляют одни и те же данные, и одно обновление перезаписывает другое, теряя изменения.

Средства решения в БД:

  1. Оптимистичная блокировка (Optimistic Locking)

    • В таблицу добавляется поле версии (например, version или updated_at).
    • При обновлении проверяется, что версия не изменилась с момента чтения.
    • Если версия изменилась, обновление отклоняется, и процесс повторяет операцию.

    Пример на SQL:

    UPDATE board
    SET content = :new_content, version = version + 1
    WHERE id = :board_id AND version = :old_version;
    
  2. Пессимистическая блокировка (Pessimistic Locking)

    • Использование SQL-запросов с блокировками, например SELECT ... FOR UPDATE.
    • При чтении строки она блокируется для других транзакций до завершения текущей.
  3. Транзакции с уровнем изоляции SERIALIZABLE

    • Обеспечивает последовательное выполнение транзакций.
    • Может привести к блокировкам и снижению производительности.

Оптимистичная блокировка чаще предпочтительна для веб-приложений с высокой конкуренцией и низкой вероятностью конфликтов, так как она более масштабируема и менее блокирует ресурсы.