【发布时间】:2023-03-31 06:41:01
【问题描述】:
我在单个表上使用 SQL Server (15) 中的更改跟踪。我的客户端应用程序每 x 分钟运行一次,并检查表数据是否已更改以使某些缓存无效。在单个事务中,客户端首先获取当前的更改跟踪版本 (CHANGE_TRACKING_CURRENT_VERSION()),然后查询与客户端之前运行时相比的更改。客户端知道CHANGE_TRACKING_CURRENT_VERSION() 的先前值是什么,因为它在成功运行后将其值存储在(同一数据库的)单独的表中。所以当客户端完成后,客户端会用当前版本覆盖之前的更改跟踪版本。
为了避免在没有任何更改时使缓存失效,除其他外,客户端会检查更改跟踪版本是否比以前大。但是,由于客户端将先前的更改跟踪版本存储在数据库本身中(这会导致版本递增),因此当前更改跟踪版本将始终大于存储的先前更改跟踪版本。
例如,假设存储版本为 5,当前版本为 6。客户端将运行并最终用当前版本覆盖存储版本。现在存储的值是6,但是因为存储这个值被SQL Server Change Tracking认为是一个变化,所以当前版本的变化跟踪会变成7。下次运行时,客户端会再次运行(因为7大于6)它最终会再次用当前版本覆盖存储的版本。会一直这样下去。
有没有办法解决这个问题,而不必将以前的更改跟踪版本存储在不同的数据库中?
【问题讨论】:
标签: sql-server change-tracking sql-server-2019