首页 > 解决方案 > 使用 SQL Server 更改跟踪时如何存储 CHANGE_TRACKING_CURRENT_VERSION?

问题描述

我在单个表上使用 SQL Server (15) 中的更改跟踪。我的客户端应用程序每x分钟运行一次,并检查表数据是否已更改以使某些缓存无效。在单个事务中,客户端首先获取当前的更改跟踪版本 ( CHANGE_TRACKING_CURRENT_VERSION()),然后查询与客户端之前运行时相比的更改。客户端知道先前的值CHANGE_TRACKING_CURRENT_VERSION()是什么,因为它在成功运行后将其值存储在(同一数据库的)单独的表中。因此,当客户端完成后,客户端会用当前版本覆盖先前的更改跟踪版本。

为了避免在没有任何更改时使缓存失效,除其他外,客户端会检查更改跟踪版本是否比以前大。但是,由于客户端将先前的更改跟踪版本存储在数据库本身中(这会导致版本增加),因此当前更改跟踪版本将始终大于存储的先前更改跟踪版本。

例如,假设存储版本为 5,当前版本为 6。客户端将运行并最终用当前版本覆盖存储版本。现在存储的值是6,但是因为存储这个值被SQL Server Change Tracking认为是一个变化,所以当前版本的变化跟踪会变成7。下次运行时,客户端会再次运行(因为7大于6)它最终会再次用当前版本覆盖存储的版本。会一直这样下去。

有没有办法解决这个问题,而不必将以前的更改跟踪版本存储在不同的数据库中?

标签: sql-serverchange-trackingsql-server-2019

解决方案


事实证明,我还错误地在第二个表上启用了更改跟踪,我在该表中存储了以前的更改跟踪版本。这导致了我描述的问题。在意识到这一点并在不需要的表上禁用更改跟踪后,我不再遇到问题。


推荐阅读