基本上我有一个存储过程,在表中插入一行,我需要获取该行的标识。
我正在开发一个涉及实时数据处理的项目,我有两个基本上具有相同结构(模式)的表,唯一的区别是第一个表只包含已完成的"会话" ,而另一个仅包含"活动会话"(尚未完成并且当前正在实时修改的会话)。
我还有另一个表(第三个表),其中包含有关会话的用户编写的注释。该关系是表中的SessionID(标识)列,其中包含已完成的结果。
基本上,实时表中的所有会话都有sessionid 0(因为它们目前正在修改,我不知道它们什么时候结束)。当在" ID"上调用此SP时,会话#34; ID"被删除,并将其移至具有完成结果的表格。当行插入完成的结果表中时,"会话ID"自动添加。
现在我正在使用SCOPE_IDENTITY(),SP看起来像这样:
procedure [dbo].[EndActiveSession](@ID bigint)
as begin
declare @column1variable bigint
select @column1variable = column1 from realTimeTable where ID = @ID
if @column1variable > 0
begin
insert into FinishedResultsTable(ID, column1, column2, column3, column4, column5, column6, column7)
select ID, column1, GETDATE(), column2, column3, column4, column5, column6
from realTimeTable
where ID = @ID and column1 > 0
declare @SessionID bigint
select @SessionID = SCOPE_IDENTITY()
update comments_table set SessionID = @SessionID
where SessionID = 0 and ID = @ID
end
delete from realTimeTable where ID = @ID
--the rest of the logic, that doesn't concern these tables and works perfectly fine
end
问题在于始终无法正常工作。有时评论并未指向正确的会话ID"
我检查了其他主题,在microsoft docs中搜索过,但是找不到任何东西。这是
非常感谢任何输入!
答案 0 :(得分:0)
看起来像竞争条件。 SCOPE_IDENTITY()
正常运行。
在您发布的代码中,当“会话”在两个表中都有状态时(在插入之后,在删除之前),存在重叠。在此期间可以添加评论。有些会更新,有些则不会。此外,因为更新需要添加SessionID = 0
谓词,表明ID = @ID
条件不足以找到会话注释,进一步指示竞争条件。并且限制所有,看起来没有任何事务可以覆盖工作,因此任何中间错误都会使状态不一致。并且没有错误检查,INSERT .. SELECT ...
可能会插入0行,不会产生任何身份。
这看起来真的模型不佳。在创建时生成唯一的会话ID,将其与归档一起传输,将注释链接到永不改变的一个会话ID。
答案 1 :(得分:0)
使用@@ IDENTITY或SCOPE_IDENTITY的另一种选择是这样的 -
create table Fred (
Id int identity(1, 1)
, SomeText varchar(120)
, SomeDate datetime
, SomeAmt float
);
declare @t table (Id int);
insert into Fred (SomeText, SomeDate, SomeAmt)
output inserted.Id into @t
select 'BILL', GETDATE(), 123.4;
select * from @t;
最后你会发现表变量@t将有一行,其中包含新插入的行ID。