sql-server - 在 SQL Server 上计算 rowversion 列时

标签 sql-server tsql transactions rowversion

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

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

这是我的问题的可视化:

Rowversion issue diagram

最佳答案

通过几个脚本很容易看到。

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

关于sql-server - 在 SQL Server 上计算 rowversion 列时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201544/

相关文章:

sql - 递归 CTE 未获得预期结果。如何仅分配 anchor ?

php - 如果发生错误,更新行和回滚 SQL 数据库的最佳方法是什么?

Spring @Transactional 值参数与 SpEL(Spring 表达式语言)

java - 带 hibernate 的 DAO 和服务层

java - 将 MS SQL 数据库连接到 Java 程序

sql - 计算距离时,我的查询收到以下错误

c# - 回滚后提交事务会发生什么?

SQL Server : Where condition based on the parameters

c# - Entity Framework 6 - GetExecutionPlan 性能命中

c# - 创建 ASP.Net 成员数据库的代码