sql-server - 使用 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)它最终会再次用当前版本覆盖存储的版本。会一直这样下去。
有没有办法解决这个问题,而不必将以前的更改跟踪版本存储在不同的数据库中?
解决方案
事实证明,我还错误地在第二个表上启用了更改跟踪,我在该表中存储了以前的更改跟踪版本。这导致了我描述的问题。在意识到这一点并在不需要的表上禁用更改跟踪后,我不再遇到问题。
推荐阅读
- c# - 如何从asp.net核心MVC jquery中的链接隐藏Id参数?
- c++ - 如何在 Windows 10 中查看 Docker 默认标准输出?
- c# - C# 相机表单无法第二次打开
- .net - SqlServer 选择的列数据填充了不需要的空格
- python - Python 多个 dict 到 df
- css - npm boostrap 版本(4.1.0)不会将所有 css 属性添加到 css 'background' 标签
- javascript - 制作模态(e.target)
- ms-word - VSTO 4 ServerDocument 类失败
- c# - 在 C# 中发送 HTTP 请求失败
- reactjs - 单击按钮时输入未更新