[英]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.