0

如果 ETL 进程尝试通过将列定义的行包含rowversionrowversion“增量窗口”内来检测 SQL Server 中系统版本表上的数据更改,例如:

where row_version >= @previous_etl_cycle_rowversion
  and row_version < @current_etl_cycle_rowversion

@previous_etl_cycle_rowversion..和的值@current_etl_cycle_rowversion是从一个日志表中选择的,该表的最新值rowversion在每个 ETL 周期开始时通过以下方式附加到所述日志表中:

insert into etl_cycle_logged_rowversion_marker (cycle_start_row_version)
select @@DBTS

...是否有可能由于的行为相对于事务一致性而错过/跳过rowversion落入给定“增量窗口”(由 2 个@@DBTS值限制)内的记录?rowversion- 即,是否有可能rowversion反映在“最终”一致性的基础上?

我正在考虑这样一种情况,即在单个事务中更新了 1000 条记录,并且以某种方式@@DBTS“提前”了记录的提交rowversion,但该记录的特定版本尚不可读......

(为了确定问题的范围,请排除在如此大的批量事务中删除记录或立即连续更新给定记录的任何情况。)

4

2 回答 2

1

如果您确保避免对读取更改窗口的查询进行行版本控制,您不应该错过很多行。使用 READ COMMITTED SNAPSHOT 或 SNAPSHOT ISOLATION 更新但未提交的行不会出现在您的查询中。

但是您也可能会错过查询@@dbts 后更新的行。这通常没什么大不了的,因为它们会在下一个窗口中出现。但是,如果您有一个不断更新的行,您可能会错过很长时间。

但为什么要使用 rowversion?如果这些是临时表,您可以直接查询历史表。并且更改跟踪比使用 rowversion 更好、更容易,因为它可以跟踪删除和可选的列更改。该功能实际上是为了取代手动执行此操作的需要:

通常涉及大量工作,并且经常涉及使用触发器、时间戳列、存储跟踪信息的新表和自定义清理过程的组合

.

于 2020-05-23T02:37:29.750 回答
0

在 SNAPSHOT 隔离下,事实证明,检查rowversion哪个函数可以确保连续的增量窗口,同时不跳过rowversion附加到长时间运行事务的值,MIN_ACTIVE_ROWVERSION() 而不是 @@DBTS.

于 2020-06-01T15:32:38.657 回答