Sql @@身份与并发
假设我有一个表TableA,它的主键被标记为Sql @@身份与并发,sql,multithreading,identity,Sql,Multithreading,Identity,假设我有一个表TableA,它的主键被标记为IDENTITY,我在存储过程中执行以下两条语句 INSERT INTO TableA VALUES ('a', 'b', 'c', 'd') SET @SomeVariable = @@IDENTITY 为了使@SomeVariable存储刚刚添加的值的主键。如果另一个客户端在执行上述语句之间执行相同的insert,是否有可能@@IDENTITY因此@SomeVariable存储了错误的(最近的)值 非常感谢。这取决于你对另一位客户的看法@@IDE
IDENTITY
,我在存储过程中执行以下两条语句
INSERT INTO TableA VALUES ('a', 'b', 'c', 'd')
SET @SomeVariable = @@IDENTITY
为了使@SomeVariable
存储刚刚添加的值的主键。如果另一个客户端在执行上述语句之间执行相同的insert,是否有可能@@IDENTITY
因此@SomeVariable
存储了错误的(最近的)值
非常感谢。这取决于你对另一位客户的看法@@IDENTITY返回在连接/会话上生成的最后一个标识值(与命令的表或范围无关)
因此,如果您的客户端不共享连接,则答案是“否”。如果他们共享连接(我不这样认为,因为它会有许多其他问题),则答案是“是”。
@@IDENTITY
仅用于您的连接(而非全局),因此您应该获取连接上发生的最后一个标识值。但是,这可能来自不同的范围,例如触发器
这就是为什么最佳实践是这样的:它适用于插入的范围,不考虑触发器等
对于一个真正全局的、非并发的、坦率地说是愚蠢的解决方案,这是一个很好的选择。这将受到每个连接并写入表的人的影响