Я использую отслеживание изменений в SQL Server (15) на одной таблице. Мое клиентское приложение запускается каждые x минут и проверяет, были ли изменены данные таблицы, чтобы сделать недействительным какой-либо кэш. В рамках одной транзакции клиент сначала получает текущую версию отслеживания изменений (CHANGE_TRACKING_CURRENT_VERSION()
), а затем запрашивает изменения по сравнению с тем, когда ранее выполнялся клиент. Клиент знает, что было предыдущим значением CHANGE_TRACKING_CURRENT_VERSION()
, потому что он сохраняет свое значение в отдельной таблице (той же базы данных) после успешного запуска. Поэтому, когда клиент готов, клиент перезаписывает предыдущую версию отслеживания изменений текущей.
Во избежание аннулирования кэша, когда ничего не было изменено, среди прочего клиент проверяет, больше ли версия отслеживания изменений, чем перед. Однако, поскольку клиент сохраняет предыдущую версию отслеживания изменений в самой базе данных (что приводит к увеличению версии), текущая версия отслеживания изменений всегда будет больше, чем сохраненная предыдущая версия отслеживания изменений.
Например, допустим, сохраненная версия равна 5, а текущая версия - 6. Клиент запустится и в конечном итоге перезапишет сохраненную версию текущей версией. Теперь сохраненное значение равно 6, но поскольку сохранение этого значения считается изменением SQL Отслеживание изменений сервера, текущей версией отслеживания изменений станет 7. При следующем запуске клиент снова запустится (так как 7 больше, чем 6) и это в конечном итоге перезапишет сохраненную версию текущей версией. Он будет go включаться вечно.
Есть ли способ решить эту проблему, не сохраняя предыдущую версию отслеживания изменений в другой базе данных?