我的问题是,如果我在一个表中并行插入两个批处理,SQL Server 如何创建标识值?
我的意思是,如果在一个会话中我插入多行(Row1-Row2-Row3),同时另一个会话同时插入多行(Row4-Row5-Row6),结果会是这样吗?
Row1
Row2
Row3
Row4
Row5
Row6
或者可能是这样的?
Row1
Row6
Row3
Row5
Row4
Row2
我的问题是,如果我在一个表中并行插入两个批处理,SQL Server 如何创建标识值?
我的意思是,如果在一个会话中我插入多行(Row1-Row2-Row3),同时另一个会话同时插入多行(Row4-Row5-Row6),结果会是这样吗?
Row1
Row2
Row3
Row4
Row5
Row6
或者可能是这样的?
Row1
Row6
Row3
Row5
Row4
Row2
您正在犯在表格中假设顺序的常见谬误。表没有顺序。只有结果有顺序,除非指定了明确的 ORDER BY,否则它是不确定的。
您可能会问一个不同的问题:在并发插入的情况下,标识生成的值是如何分配的?答案很简单:没关系。如果您对订单做出任何假设,那么您的代码就会被破坏。间隙也是如此。即使生成的身份是完全随机的,您的应用程序也应该可以工作,并且如果身份是完全随机的,正确编写的应用程序也可以工作。用于SCOPE_IDENTITY()
检索最后插入的标识。更好的是,使用OUTPUT
of 子句INSERT
,它也适用于多行插入。
记录一下:身份是按照操作获取日志流访问权的顺序生成的。