通常的做法是在INSERT
后面使用@@IDENTITY
变量获取表格的新创建的IDENTITY
。使用@@ DBTS在INSERT后检索新的rowversion是否安全?
以类似的方式使用@@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
从并发更新安全吗?
如果另一个连接在UPDATE
和PRINT
之间执行插入和更新操作,那么我们最终将得到rowversion
的“其他”连接而不是我们自己更新的连接吗?
使用'@ Identity'不处理并发或随后的插入在另一个范围内发生(例如在触发器中)。通常会使用[SCOPE_IDENTITY](https://msdn.microsoft.com/en-us/library/ms190315.aspx)。 – Richard
对于数据库上的并发操作,“@@ DBTS”不安全。你不能保证该版本与你的'插入/更新/删除'相关。 – ughai
谢谢。我对'@@ DBTS'怀疑得很多,但我没有意识到'@@ IDENTITY'也不是线程安全的。我有一些重构工作要做! –