2017-02-13 3 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値を照会することを含め、同じトランザクション内のテーブルを自由に再クエリできます。

関連する問題