在 SQL Server 上计算 rowversion 列时

Dam*_*ski 3 t-sql sql-server transactions rowversion

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

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

这是我的问题的可视化:

Rowversion 问题图

Dam*_*ver 5

用几个脚本很容易看到。

脚本 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
Run Code Online (Sandbox Code Playgroud)

脚本2:

begin transaction
insert into T1 (ID) values (2)
commit
select * from T1 with (nolock)
Run Code Online (Sandbox Code Playgroud)

打开两个脚本并连接到同一个数据库。运行脚本 1,当它仍在运行时,切换到脚本 2 并运行它。

你会得到这个结果(或类似的):

ID          rv
----------- ------------------
1           0x00000000000007D1
2           0x00000000000007D2
Run Code Online (Sandbox Code Playgroud)

如您所见,ID 1尚未提交的带有 的行已被分配低值rowversion


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