Я использую столбцы 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 из чужого обновления. Затем я наткнулся на оператор OUTPUT в документации по версии (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 вызовов и синхронизировал их )параметр OUTPUT занимает примерно на 40% больше времени, но все же меньше половины миллисекунды. Ни то, ни другое не заняло заметного времени при включенной функции SET STATISTICS TIME ON.
Мой вопрос: кто-нибудь знает лучший/более простой способ сделать это?
Я надеялся на функцию, аналогичную SCOPE _IDENTITY ()для столбцов идентификаторов, но не могу найти ничего подобного. Кто-нибудь знает, если я что-то пропустил?
Заранее спасибо.