在 SQL 服务器上计算 rowversion 列时
When rowversion column is calculated on SQL Server
当在SQL服务器上计算rowversion类型的列时?是在事务提交时还是之前(连同行修改操作)?我在问,因为对我来说,提交的事务是否实际上可以导致比已经提交的版本更低的版本。
这似乎是非常基本的问题,但 MSDN 文档没有提供此类信息。我在其他地方也找不到。
这是我的问题的可视化:
使用几个脚本很容易看到。
脚本 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,当它还在 运行ning 时,切换到脚本 2 并 运行 它。
您将得到以下结果(或类似结果):
ID rv
----------- ------------------
1 0x00000000000007D1
2 0x00000000000007D2
如您所见,具有 ID
1
的行尚未提交,已分配了较低的 rowversion
值。
仔细一想,当然得这样了。交易可以跨越多个语句(如第一个脚本所示),您可以在同一交易中自由 re-query 一个 table,包括查询您自己的交易刚刚的特定 rowversion
值设置。
当在SQL服务器上计算rowversion类型的列时?是在事务提交时还是之前(连同行修改操作)?我在问,因为对我来说,提交的事务是否实际上可以导致比已经提交的版本更低的版本。
这似乎是非常基本的问题,但 MSDN 文档没有提供此类信息。我在其他地方也找不到。
这是我的问题的可视化:
使用几个脚本很容易看到。
脚本 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,当它还在 运行ning 时,切换到脚本 2 并 运行 它。
您将得到以下结果(或类似结果):
ID rv
----------- ------------------
1 0x00000000000007D1
2 0x00000000000007D2
如您所见,具有 ID
1
的行尚未提交,已分配了较低的 rowversion
值。
仔细一想,当然得这样了。交易可以跨越多个语句(如第一个脚本所示),您可以在同一交易中自由 re-query 一个 table,包括查询您自己的交易刚刚的特定 rowversion
值设置。