繁体   English   中英

我可以在SQL @@ identity上遇到问题并且没有触发器吗?

[英]Can I have problems with SQL @@identity and no triggers?

编码

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是否有问题?

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

因此,没有,在多线程ASP.NET环境中使用@@IDENTITY没有危险。

顺便说一句,最好不要使用@@IDENTITY ; 使用SCOPE_IDENTITY()代替。 在有人在桌子上添加触发器之后,后者也可以工作。

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

select scope_identity()

sql server 2008中有一个错误,因此您可能会得到不正确的值。 详细信息: SCOPE_IDENTITY()有时返回不正确的值

我不确定2005年是否有它,但是如果有,output子句是最好的选择。 如果不使用scope_identity(),您将永远无法预测何时添加触发器,并且可能需要一段时间才能发现建立了错误的子关系,并且几乎无法修复以这种方式弄乱的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM