SQL Server的rowversion和顺序

时间:2014-12-30 18:01:30

标签: .net sql-server sql-server-2012

我正在使用多个表中的rowversion属性进行更改跟踪。周期性进程使用rowversion转换为BIGINT数据类型(作为计算列)的联合查询许多表。然后它记录读取的最高数字,然后记录下一个更高数字的查询。

我观察到在高并发情况下,多个线程正在写入并且一个线程正在查询更改,有时它最终会读取更高的rowversion值,然后写入更低的数字。

较低版本的值永远不会被拾取,从而导致同步问题。

有关msdn的

rowversion文档说明了

  

rowversion数据类型只是一个递增的数字

想知道在完成交易或开始交易时我是否可以依赖增量?

使用SQL Server 2012的默认事务隔离

1 个答案:

答案 0 :(得分:1)

增量的时间是在行更改时,无论事务何时提交:

实施例。 (注意@@dbts是当前数据库的rowversion值。)

select @@version
create table t (c int, rv rowversion)
go
begin transaction
print @@dbts
insert into t (c) values (1)
print @@dbts
insert into t (c) values (2)
print @@dbts
insert into t (c) values (3)
print @@dbts
commit
select * from t

结果,请注意@@dbts随每个插入递增,并且插入获得更高的递增值。全部在一次交易中。

Microsoft SQL Server 2014 - 12.0.2254.0 (X64)
Jul 25 2014 18:52:51
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64>
(Build 7601: Service Pack 1) (Hypervisor) 

0x00000000000007D0
0x00000000000007D1
0x00000000000007D2
0x00000000000007D3

C   RV
1   0x00000000000007D1
2   0x00000000000007D2
3   0x00000000000007D3