使用 @@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
可以避免并发更新吗?
如果另一个连接在 UPDATE
和 PRINT
之间执行插入和更新,我们最终会得到 'other' 连接的 rowversion
而不是那个连接吗来自我们自己的更新?
根据 MSDN @@DBTS
returns the last-used timestamp value of the current database
这意味着它不是线程安全的。
您也不应该使用 @@IDENTITY
。 @@IDENTITY
和 SCOPE_IDENTITY
return 在当前会话中任何 table 中生成的最后一个标识值。但是,SCOPE_IDENTITY
returns 的值只在当前范围内; @@IDENTITY
不限于特定范围。例如,如果在具有标识列的 table 上执行触发器,@@IDENTITY
可能会得到错误的值。
通常的做法是在 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
可以避免并发更新吗?
如果另一个连接在 UPDATE
和 PRINT
之间执行插入和更新,我们最终会得到 'other' 连接的 rowversion
而不是那个连接吗来自我们自己的更新?
根据 MSDN @@DBTS
returns the last-used timestamp value of the current database
这意味着它不是线程安全的。
您也不应该使用 @@IDENTITY
。 @@IDENTITY
和 SCOPE_IDENTITY
return 在当前会话中任何 table 中生成的最后一个标识值。但是,SCOPE_IDENTITY
returns 的值只在当前范围内; @@IDENTITY
不限于特定范围。例如,如果在具有标识列的 table 上执行触发器,@@IDENTITY
可能会得到错误的值。