在更新语句获取最新rowversion /时间戳值 - SQL服务器(Getting latest

2019-07-30 06:43发布

我使用rowversion列处理乐观并发,并希望得到新的rowversion值回来时,我已经做了更新,使我的数据层拥有最新的价值,可以与得到一个并发异常(除非记录有执行另一次更新已经更新通过别人)。

我只是在做数据层的获取做一个更新后,但是这是不是很有效或完全可靠。

对于下表:

CREATE TABLE PurchaseType
(
    PurchaseTypeCode nvarchar(20) NOT NULL PRIMARY KEY CLUSTERED (PurchaseTypeCode),
    Name nvarchar(50) NOT NULL,
    TS rowversion NOT NULL
)

我试过了:

CREATE PROCEDURE PurchaseType_UpdateWithGet
@PurchaseTypeCode nvarchar(20),
@Name nvarchar(50),
@TS rowversion OUTPUT    
AS

UPDATE PurchaseType
SET Name = @Name
WHERE PurchaseTypeCode = @PurchaseTypeCode
 AND TS = @TS

SELECT @TS = TS FROM PurchaseType WHERE PurchaseTypeCode = @PurchaseTypeCode
GO

但由于没有得到来自别人的更新rowverion值的可能性不是完全满意。 然后我rowversion文档在输出此言一(http://msdn.microsoft.com/en-us/library/ms182776.aspx / http://msdn.microsoft.com/en-us/library/ms177564.aspx )并尝试这样的:

CREATE PROCEDURE PurchaseType_UpdateWithOutput
@PurchaseTypeCode nvarchar(20),
@Name nvarchar(50),
@TS rowversion OUTPUT    
AS

DECLARE @Output TABLE (TS BINARY(8))

UPDATE PurchaseType
SET Name = @Name
    OUTPUT inserted.TS into @Output
WHERE PurchaseTypeCode = @PurchaseTypeCode
    AND TS = @TS

SELECT TOP 1 @TS = TS FROM @Output
GO

这种运作良好。 在我的非常基本的测试(只是运行10000个电话和时间的话)输出选项需要大约40%的时间,但仍然不到半毫秒。 无论采取任何可测量时间SET STATISTICS TIME ON。

我的问题是,没有人知道的更好/更简单的方法来做到这一点?

我所希望的功能,我可以使用类似SCOPE_IDENTITY()标识列,但找不到这样的事情。 任何人都知道,如果我失去了一些东西?

提前致谢。

Answer 1:

从MSDN :

@@ DBTS返回当前数据库的上次使用时间戳值。 当与timestamp列的行被插入或更新生成新的时间戳值。



Answer 2:

你的问题是,别人更新之间,选择更新的行。 所以,当你做你的更新语句之后选择你没有得到相同的值。 这是不可重复读的问题。 你应该应该使用锁定提示(UPDLOCK)与update语句。 此锁将允许读者(即共享锁),但将阻止作家。 所以,你将更新后得到相同的行。 所以,你的存储过程应该是 -

CREATE PROCEDURE PurchaseType_UpdateWithGet
@PurchaseTypeCode nvarchar(20),
@Name nvarchar(50),
@TS rowversion OUTPUT    
AS

UPDATE PurchaseType with (updlock)
SET Name = @Name
WHERE PurchaseTypeCode = @PurchaseTypeCode
 AND TS = @TS

SELECT @TS = TS FROM PurchaseType WHERE PurchaseTypeCode = @PurchaseTypeCode
GO


文章来源: Getting latest rowversion/timestamp value in update statement - Sql Server