使用@@ DBTS INSERT后检索新的rowversion - 是否安全?

时间:2015-04-29 10:20:10

标签: sql-server rowversion

通常的做法是在IDENTITY之后使用@@IDENTITY变量选取新创建的INSERT表格。

使用@@DBTS值以类似方式检索rowversion之后的最后UPDATE值是否正确?

例如:

IF(OBJECT_ID('XXX') IS NOT NULL)
    DROP TABLE XXX
GO
CREATE TABLE XXX
(
    ID int IDENTITY(1,1) PRIMARY KEY,
    Name varchar(64) NOT NULL,
    RV rowversion
)
GO
INSERT INTO XXX(Name) VALUES 
    ('Apples'),('Bananas'),('Cranberries'),('Dragon Fruit'),('Eggplant'),('Fig'),('Grape')
GO
SELECT * FROM XXX
GO
UPDATE XXX
    SET Name = 'Chocolate' WHERE ID = 3
PRINT @@DBTS
GO

现在@@DBTS对并发更新安全吗?

如果另一个连接在UPDATEPRINT之间执行插入和更新,我们最终会得到'其他'的rowversion。连接而不是我们自己的更新?

1 个答案:

答案 0 :(得分:0)

根据MSDN @@DBTS

  

返回当前数据库的最后使用的时间戳值

这意味着它不是线程安全的。

您也不应该使用@@IDENTITY@@IDENTITYSCOPE_IDENTITY返回当前会话中任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY仅在当前范围内返回值; @@IDENTITY不限于特定范围。如果在具有标识列的表上执行触发器,@@IDENTITY可以返回错误的值。