TL;DR:下面的问题归结为:插入行时,在生成新Identity
值和锁定聚集索引中的相应行键之间是否存在机会窗口,外部观察者可以在其中看到更新的值 Identity
并发事务插入的值?(在 SQL Server 中。)
详细版
我有一个 SQL Server 表,其中有一个Identity
名为的列CheckpointSequence
,它是该表的聚集索引(它还具有许多其他非聚集索引)的键。行由多个并发进程和线程(在隔离级别和没有)插入到表中。同时,有进程定期从聚集索引中读取行,按该列排序(也在隔离级别,关闭该选项)。READ COMMITTED
IDENTITY_INSERT
CheckpointSequence
READ COMMITTED
READ COMMITTED SNAPSHOT
我目前依赖于读取过程永远不能“跳过”检查点的事实。我的问题是:我可以依赖这个属性吗?如果没有,我该怎么做才能使它成为现实?
示例:当插入标识值为 1、2、3、4 和 5的行时,读者在看到值为 4 的行之前不得看到值为 5 的行。测试表明该查询包含一个ORDER BY CheckpointSequence
子句 (和WHERE CheckpointSequence > -1
子句),当第 4 行被读取但尚未提交时可靠地阻塞,即使第 5 行已经提交。
我相信至少在理论上,这里可能存在竞争条件,可能会导致这个假设被打破。不幸的是,Identity
关于Identity
在多个并发事务的上下文中如何工作的文档并没有太多说明,它只说“每个新值都是基于当前的种子和增量生成的”。和“特定事务的每个新值都不同于表上的其他并发事务。” (微软)
我的推理是,它必须以某种方式工作:
我认为在第 2 …
在我的应用程序中,有一个运行在 SQL Server 2012 上的数据库,我有一个作业(计划任务),它定期执行一个昂贵的查询并将结果写入一个表,稍后可以由应用程序查询。
理想情况下,我只想在自上次执行查询后发生更改时运行该昂贵的查询。由于源表非常大,我不能只选择所有候选列的校验和或类似的东西。
我有以下想法:
但是,我真的很想知道是否有一种轻量级的方法来检测表上的更改,而无需我明确跟踪写入。例如,我可以获取ROWVERSION
表格的“当前”或类似的信息吗?