2017-02-13 90 views
0

在SQL Server上計算rowversion類型的列時?是事務提交還是之前(與行修改操作一起)?我在問,因爲對於我來說,提交的事務實際上是否會導致低於已提交版本的版本,這一點非常重要。在SQL Server上計算rowversion列時

這似乎是非常基本的問題,但MSDN文檔不提供此類信息。我無法在其他任何地方找到它。

這裏是我的問題的可視化:

Rowversion issue diagram

回答

2

很容易被看見一對夫婦的腳本。

腳本1:

create table T1 (
    ID int not null, 
    rv rowversion not null 
) 
go 
begin transaction 

insert into T1 (ID) values (1) 

WAITFOR DELAY '00:03:00' 

commit 

腳本2:

begin transaction 
insert into T1 (ID) values (2) 
commit 
select * from T1 with (nolock) 

打開這兩個腳本並連接到相同的數據庫。運行腳本1,當它仍在運行時,切換到腳本2並運行它。

你會得到這樣的結果(或類似):

ID   rv 
----------- ------------------ 
1   0x00000000000007D1 
2   0x00000000000007D2 

正如你可以看到,該行與ID1,這還沒有提交,已經分配了低rowversion值。


反思當然,它必須是這樣。事務可以跨越多個語句(如第一個腳本所示),並且可以在同一個事務中自由地重新查詢表,包括查詢您自己的事務剛剛設置的具體rowversion值。