在SQL Server上计算rowversion列时

时间:2017-02-13 10:13:20

标签: sql-server tsql transactions rowversion

在SQL Server上计算rowversion类型的列时?是在事务提交之前还是之前(以及行修改操作)?我问,因为对我来说非常重要的是,提交的事务是否真的会导致版本低于已经提交的版本。

这似乎是非常基本的问题,但MSDN文档不提供此类信息。我在其他任何地方都找不到它。

这是我的问题的可视化:

Rowversion issue diagram

1 个答案:

答案 0 :(得分:3)

使用几个脚本很容易看到。

脚本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

如您所见,尚未提交的ID 1行已被指定为低rowversion值。

当然,反思必须是这样的。事务可以跨多个语句(如第一个脚本所示),您可以自由地在同一事务中重新查询表,包括查询您自己的事务所设置的特定rowversion值。