通常的做法是在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
对并发更新安全吗?
如果另一个连接在UPDATE
和PRINT
之间执行插入和更新,我们最终会得到'其他'的rowversion
。连接而不是我们自己的更新?
答案 0 :(得分:0)
根据MSDN @@DBTS
返回当前数据库的最后使用的时间戳值
这意味着它不是线程安全的。
您也不应该使用@@IDENTITY
。 @@IDENTITY
和SCOPE_IDENTITY
返回当前会话中任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY
仅在当前范围内返回值; @@IDENTITY
不限于特定范围。如果在具有标识列的表上执行触发器,@@IDENTITY
可以返回错误的值。