Я работаю в системе, которая зеркалирует удаленные наборы данных, используя инициалы и дельты. Когда вводится инициал, он массово удаляет все существующее и массово вставляет свежие данные. Когда появляется дельта, система выполняет большую часть работы, чтобы перевести ее в обновления, вставки и удаления. Инициалы и дельты обрабатываются внутри длинных транзакций для поддержания целостности данных.
К сожалению, текущее решение не очень хорошо масштабируется. Транзакции настолько велики и продолжительны, что наша СУБД перегружена различными проблемами конкуренции. Кроме того, не существует хорошего контрольного журнала о том, как применяются дельты, что затрудняет устранение проблем, приводящих к потере синхронизации локальной и удаленной версий набора данных.
Одна из идей состоит в том, чтобы вообще не запускать инициалы и дельты в транзакциях, а вместо этого прикреплять номер версии к каждой записи, указывающей, из какой дельты или инициала она поступила. Как только инициал или дельта успешно загружены, приложение может быть предупреждено, что доступна новая версия набора данных.
Это просто оставляет вопрос о том, как точно составить представление набора данных до заданной версии из исходных данных и дельт. (Apple TimeMachine делает нечто подобное, используя жесткие ссылки в файловой системе для создания «представления» определенного момента времени.)
Есть ли у кого-нибудь опыт решения этой проблемы или реализации этого конкретного решения?
Спасибо!