0

通常的做法是IDENTITY使用.@@IDENTITYINSERT

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

例如:

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得到“其他”连接而不是我们自己更新的连接吗?

4

1 回答 1

0

根据 MSDN@@DBTS

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

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

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

于 2015-04-29T10:38:05.153 回答