2015-08-26 3 views
1

У меня есть несколько хранимых процедур, в которых выполняется несколько запросов. Чтобы получить последнее удостоверение вставки, я использую IDENT_CURRENT, что является причиной проблемы.Как записывать безопасные хранимые процедуры SQL Server

Мой вопрос: могу ли я иметь операторы блокировки, такие как C# в T-SQL, чтобы он мог быть потокобезопасным?

EDIT: код я использую

INSERT INTO activities 
    (creator 
    ,title 
    ,description) 
VALUES 
    (@Creator 
    ,@Tile 
    ,@Description) 

SET @ActivityId = IDENT_CURRENT('dbo.activities'); 

INSERT INTO [dbo].activity_cfs 
    ([activity_id], 
    [cf_id], 
    [cf_field_name], 
    [field_key], 
    [value]) 
SELECT 
    @ActivityId, 
    cf_id, 
    cf_field_name, 
    field_key, 
    value 
FROM @ActivityCustomFields 

@ActivityCustomFields мой темп таблицы.

+0

Некоторый код пожалуйста. Мы не можем предположить, что вы написали правильный код :-) – Amit

ответ

5

Вполне вероятно, что вы должны использовать SCOPE_IDENTITY вместо IDENT_CURRENT. Существует много объяснений того, как они отличаются, например: What is the difference between Scope_Identity(), Identity(), @@Identity, and Ident_Current?

Но если вам действительно нужно гарантировать, что определенная часть кода не будет выполняться несколькими потоками одновременно, вы можете использовать sp_getapplock.


на основе кода, который был добавлен на вопрос теперь я уверен, что вы должны просто использовать SCOPE_IDENTITY, как это:

INSERT INTO activities 
    (creator 
    ,title 
    ,description) 
VALUES 
    (@Creator 
    ,@Tile 
    ,@Description); 

SET @ActivityId = SCOPE_IDENTITY(); 

INSERT INTO [dbo].activity_cfs 
    ([activity_id], 
    [cf_id], 
    [cf_field_name], 
    [field_key], 
    [value]) 
SELECT 
    @ActivityId, 
    cf_id, 
    cf_field_name, 
    field_key, 
    value 
FROM @ActivityCustomFields; 

SCOPE_IDENTITY функция возвращает последний идентификатор, созданный в той же сессии и той же области. IDENT_CURRENT возвращает последний идентификатор, созданный для конкретной таблицы или просмотра в любом сеансе. Итак, если у вас есть несколько потоков, которые выполняют эту процедуру одновременно, IDENT_CURRENT будет видеть тождества, сгенерированные в других потоках, которые вам не нужны.

Смежные вопросы