C# 如何编写线程安全的SQL Server存储过程

C# 如何编写线程安全的SQL Server存储过程,c#,sql-server,C#,Sql Server,我有一些正在执行多个查询的存储过程。为了得到插入的最后一个标识,我使用了导致问题的当前标识 我的问题是,我可以在T-SQL中使用像C这样的锁语句,这样它就可以是线程安全的吗 编辑:我正在使用的代码 INSERT INTO activities (creator ,title ,description) VALUES (@Creator ,@Tile ,@Description) SET @ActivityId = IDENT_CURRENT('d

我有一些正在执行多个查询的存储过程。为了得到插入的最后一个标识,我使用了导致问题的当前标识

我的问题是,我可以在T-SQL中使用像C这样的锁语句,这样它就可以是线程安全的吗

编辑:我正在使用的代码

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是我的临时表。

很可能您应该使用而不是当前标识。有许多不同的解释,例如:

但是,如果您确实需要保证代码的某些部分不是由多个线程同时运行,那么您可以使用

根据您添加到问题中的代码,我现在非常确定您应该简单地使用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将看到在其他线程中生成的标识,这是您不希望看到的

您很可能应该使用当前标识而不是当前标识。有许多不同的解释,例如:

但是,如果您确实需要保证代码的某些部分不是由多个线程同时运行,那么您可以使用

根据您添加到问题中的代码,我现在非常确定您应该简单地使用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将看到在其他线程中生成的标识,这是您不希望看到的

在我的理解中,SCOPE_IDENTITY将是一种方式。请遵循以下链接,即在SQL Server中使用SCOPE_标识时始终是线程安全的:


在我的理解中,范围和身份将是一条出路。请遵循以下链接,即在SQL Server中使用SCOPE_标识时始终是线程安全的:


请给我一些密码。我们不能假设您编写了正确的代码:-请编写一些代码。我们不能假设您编写了正确的代码:-