INSERT后,获取的@@IDENTITY可靠吗?(@@IDENTITY有返回结果了再执行下一步操作)

rd16 2016-01-30 08:25:30

假如同时有N个人请求这个存储过程,@UserId会不会乱?

或有没有可能这个存储过程INSERT没有执行完成,就跳到UPDATE了???

SQL有没有一种等待方法,就是一定要INSERT执行成功并返回@@IDENTITY后 再执行UPDATE

CREATE PROCEDURE Member_ADD
@UserName nvarchar(50),
@PassWord nvarchar(50)


AS


BEGIN
INSERT INTO [Member](
[UserName],[PassWord]
)VALUES(
@UserName,@PassWord
)
SET @UserId = @@IDENTITY --获取INSERT后的主键
END




BEGIN
UPDATE [Member]
SET
UserIdPath =@UserIdPath + ',' + @UserId --组成id路径,如 1,2,3,4,5
WHERE Id=@UserId --很担心这里,不知道并发量大@UserId会不会错乱,或上面@@IDENTITY 没返回值的时候就执行到这里了
END

...全文
296 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ginnnnnnnn 2016-02-01
  • 打赏
  • 举报
回复
如大版所说,合并成一个,加上事务控制,另外@@IDENTITY 还不算特别可靠,如果有触发器的话会影响值 建议使用 scope_identity()
卖水果的net 版主 2016-01-31
  • 打赏
  • 举报
回复
可靠的,这里的语句是顺序执行的,不存在并行,或跳语句现象。
中国风 2016-01-31
  • 打赏
  • 举报
回复
合并为一个,加上同一个事务处理
薛定谔的DBA 2016-01-31
  • 打赏
  • 举报
回复
--几种情况,参考吧

INSERT INTO [Member](    [UserName],[PassWord] ) 
OUTPUT  UserId into @UserId --获取主键
VALUES(    @UserName,@PassWord    )

--或者指定获取标识值
ident_current('dbo.tablename')--指定表
@@identity --全局当前标识
scope_identity --会话当前标识
---涛声依旧--- 2016-01-31
  • 打赏
  • 举报
回复
不会的 另外,用一个begin end就行了

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧