@@ IDENTITY和Concurrence

时间:2011-06-03 10:43:13

标签: sql multithreading identity

假设我有一个表 TableA ,其主键标记为IDENTITY,并且我在存储过程中执行以下两个语句

INSERT INTO TableA VALUES ('a', 'b', 'c', 'd')
SET @SomeVariable = @@IDENTITY

以便@SomeVariable存储刚刚添加的值的主键。如果另一个客户端在执行上述语句之间执行相同的插入,那么@@IDENTITY@SomeVariable是否可能存储错误的(最新的)值?

非常感谢。

2 个答案:

答案 0 :(得分:5)

@@IDENTITY仅适用于您的连接(非全局),因此您应该获得连接上发生的最后一个IDENTITY值。但是,这可能来自不同的范围,例如触发器。

这就是为什么SCOPE_IDENTITY()是最佳实践的原因:它是针对INSERT的范围而不考虑触发器等

对于一个真正的全球性,非并发性和坦率的愚蠢解决方案,它是IDENT_CURRENT。这将受到连接和写入表的所有人的影响。

答案 1 :(得分:0)

这实际上取决于你对另一个客户的意思。 @@ IDENTITY返回在连接/会话上生成的最后一个标识值(无论命令的表或范围如何)。

因此,如果您的客户不共享连接,则答案为否。如果他们分享这种联系(我不这么认为,因为它会有许多其他问题)答案是肯定的。