2014-12-30 78 views
1

我使用幾個表中的rowversion屬性進行更改跟蹤。定期進程查詢多個表,並將所有rowversion上的聯合轉換爲BIGINT數據類型(作爲計算列)。然後記錄讀取的最大數字,並在下一次查詢該數字較高的數字。SQL Server rowversion and order

我觀察到,在高併發情況下,有幾個線程正在寫入,一個線程正在查詢更改,有時最終會讀取更高的rowversion值,然後寫入更低的數字。

低版本的值永遠不會被拾取,從而導致同步問題。 MSDN上

rowversion文檔指出

的rowversion數據類型只是一個遞增數

想知道如果我可以依靠它是在完成交易或開始交易的時間增量? SQL Server 2012的

回答

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 
+0

因此,爲什麼我在較舊的版本(失序)之前看到較新的值是因爲新的事務在較早之前提交?有關如何防止這種情況的任何想法? –

+0

我不認爲你可以防止「無序」的'rowversion'數字,而不允許併發作者。同步是一個難題,我不知道如何解決。 –