我可以遇到SQL @@ identity和没有触发器的问题吗?

时间:2009-12-31 11:56:50

标签: sql sql-server-2005

代码

ALTER PROCEDURE [dbo].[spSocial.QuestionsAddNew]
    @IdUser             int,
    @IdQuestionCategory     int,
    @Title                  int,
    @Body                   int,
    @CreatedDate            int,
    @ActivityDate           int,
    @VotesCount             int,
    @AnswersCount           int,
    @ViewedCount            int
AS
BEGIN
    SET NOCOUNT ON;

    insert into
        tblSocialQuestions
        (IdUser, IdQuestionCategory, Title, Body, CreatedDate, ActivityDate, VotesCount, AnswersCount, ViewedCount)
    values
        (@IdUser, @IdQuestionCategory, @Title, @Body, @CreatedDate, @ActivityDate, @VotesCount, @AnswersCount, @ViewedCount)

    select @@IDENTITY

    exec [spSocial.Questions2Users] @IdUser, 'AskedCount', 1

END

据我理解

  

@@ identity函数返回   最后一个身份创建于同一个   会话。

     

会话是数据库   连接。范围是当前的   查询或当前存储过程。

如果会话是当前的数据库连接,那么在ASP .NET用户请求的多线程环境中使用@@ Identity是否存在问题?

如果10个用户同时添加了新问题,[spSocial.QuestionsAddNew]  存储过程是在具有相同SqlConnection的多线程环境中执行的,使用@@ Identity是不是有问题?

4 个答案:

答案 0 :(得分:2)

一个ADO.NET连接一次只能执行一个命令。在几乎所有情况下,不同的ASP.NET线程将具有不同的连接,它们在单个页面请求的持续时间内保持不变。但即使ASP.NET线程以某种方式共享连接,它们也必须以这样的方式使用连接:一次只有一个线程可以使用它,否则ADO.NET会引发错误。

所以不,在多线程ASP.NET环境中使用@@IDENTITY没有任何危险。

顺便说一句,最好不要使用@@IDENTITY;请改用SCOPE_IDENTITY()。后者在桌面上添加触发器后也可以工作。

答案 1 :(得分:0)

我认为最好使用范围标识而不是@@ Identity

select scope_identity()

答案 2 :(得分:0)

sql server 2008中存在一个错误,因此您可能会获得不正确的值。详情:SCOPE_IDENTITY() sometimes returns incorrect value

答案 3 :(得分:0)

我不确定2005是否有它,但如果确实如此,输出子句是最好的方法。如果不使用scope_identity(),因为您无法预测何时可能添加触发器,并且可能需要一段时间才能发现错误的子关系已设置并且数据以这种方式搞乱几乎无法修复。