Я пытаюсь реализовать двухфазную фиксацию в базе данных документов, которая поддерживает только однофазную фиксацию с использованием информации о транзакции для вставленных данных.
Я понимаю теорию двухфазной фиксации, нона практике существует несколько препятствий.
Допустим, существует коллекция с определенным уникальным идентификатором, и транзакция включает в себя обновление нескольких полей документа.Поэтому, чтобы сохранить старые данные для случая отката, я не могу переопределить существующий документ, но мне нужно добавить новый документ и пометить его с идентификатором транзакции:
Решение 1:
Этап подготовки:
- Вставьте новый документ в основную коллекцию с обновленными полями и пометьте его текущим идентификатором транзакции.
- Отметьтестарый документ как удаленный до принятия и пометьте его текущим идентификатором транзакции.
Фаза фиксации:
- Удалите идентификатор транзакции из добавленного (обновленного) документа.*
- Удалить старый документ (который был помечен как удаленный)
Проблема: часть 1 этапа подготовки завершится ошибкой, так как я добавляю другой документ с тем же уникальным идентификатором (хотя это просторади транзакции, но она все равно потерпит неудачу).
Решение 2:
Подготовительный этап:
- Вставить новый документв временную коллекцию сдатированные поля и пометьте его текущим идентификатором транзакции.
- Пометьте старый документ из основной коллекции как удаленный до фиксации и пометьте его текущим идентификатором транзакции.
- Переместите новый документ из временной коллекции в основную коллекцию.
- Удалите старый документ (который был отмечен как удаленный) из основной коллекции.
Проблема: фаза фиксации часть 1 может завершиться ошибкой, если при перемещении документа из временной коллекции в основную коллекцию возникает конфликт уникального ключа.
Однако я не могу допустить, чтобы эта ошибка возникала во время фазы фиксации, посколькуслишком поздно, я бы хотел, чтобы ограничение уникального ключа не сработало на этапе подготовки.
Итак, как правильно реализовать механизм двухфазной фиксации и избежать этих проблем?