使用 @@DBTS 在 INSERT 之后检索新的 rowversion - 它安全吗?

Retrieving new rowversion after INSERT using @@DBTS - is it safe?

通常的做法是在 INSERT 之后使用 @@IDENTITY 变量获取 table 的新创建的 IDENTITY

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

例如:

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 之间执行插入和更新,我们最终会得到 'other' 连接的 rowversion 而不是那个连接吗来自我们自己的更新?

根据 MSDN @@DBTS

returns the last-used timestamp value of the current database

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

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