我使用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()标识列,但找不到这样的事情。 任何人都知道,如果我失去了一些东西?
提前致谢。