我正在使用多个表中的rowversion
属性进行更改跟踪。周期性进程使用rowversion
转换为BIGINT
数据类型(作为计算列)的联合查询许多表。然后它记录读取的最高数字,然后记录下一个更高数字的查询。
我观察到在高并发情况下,多个线程正在写入并且一个线程正在查询更改,有时它最终会读取更高的rowversion
值,然后写入更低的数字。
较低版本的值永远不会被拾取,从而导致同步问题。
有关msdn的 rowversion
文档说明了
rowversion数据类型只是一个递增的数字
想知道在完成交易或开始交易时我是否可以依赖增量?
使用SQL Server 2012的默认事务隔离
答案 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