Реализация двухфазного коммита - PullRequest
2 голосов
/ 28 мая 2019

Я пытаюсь реализовать двухфазную фиксацию в базе данных документов, которая поддерживает только однофазную фиксацию с использованием информации о транзакции для вставленных данных.

Я понимаю теорию двухфазной фиксации, нона практике существует несколько препятствий.

Допустим, существует коллекция с определенным уникальным идентификатором, и транзакция включает в себя обновление нескольких полей документа.Поэтому, чтобы сохранить старые данные для случая отката, я не могу переопределить существующий документ, но мне нужно добавить новый документ и пометить его с идентификатором транзакции:

Решение 1:

Этап подготовки:

  1. Вставьте новый документ в основную коллекцию с обновленными полями и пометьте его текущим идентификатором транзакции.
  2. Отметьтестарый документ как удаленный до принятия и пометьте его текущим идентификатором транзакции.

Фаза фиксации:

  1. Удалите идентификатор транзакции из добавленного (обновленного) документа.*
  2. Удалить старый документ (который был помечен как удаленный)

Проблема: часть 1 этапа подготовки завершится ошибкой, так как я добавляю другой документ с тем же уникальным идентификатором (хотя это просторади транзакции, но она все равно потерпит неудачу).

Решение 2:

Подготовительный этап:

  1. Вставить новый документв временную коллекцию сдатированные поля и пометьте его текущим идентификатором транзакции.
  2. Пометьте старый документ из основной коллекции как удаленный до фиксации и пометьте его текущим идентификатором транзакции.
    1. Переместите новый документ из временной коллекции в основную коллекцию.
    2. Удалите старый документ (который был отмечен как удаленный) из основной коллекции.

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

    Итак, как правильно реализовать механизм двухфазной фиксации и избежать этих проблем?

...