并发、多线程、并行处理中的标识列

4 database-design sql-server primary-key concurrency multi-thread

我公司想了解一下效果:

  • 如果我们有一个带有主键标识列的表,int 主键 IDENTITY(1,1),

  • 并且应用程序正在进行多线程并行处理,试图在一张表上同时进行 1000 次插入。

身份主键列是否会失败,以任何方式违反主键,例如:处理器正在尝试输入相同的身份编号?

或者 SQL 被设计成即使在多线程并行插入中也能成功?

注意:IDENTITY_INSERT 关闭

Pau*_*ite 12

身份主键列是否会失败,以任何方式违反主键,例如:处理器试图输入相同的身份号码?

这在 SQL Server 产品文档中有介绍:

CREATE TABLE (Transact-SQL) IDENTITY (Property)

标识列可用于生成键值。列上的标识属性保证以下内容:

  • 每个新值都是根据当前种子和增量生成的。
  • 特定事务的每个新值都不同于表上的其他并发事务。

第二点是你需要的保证。

无论有多少用户进程或线程同时访问 SQL Server,它都是有效的。

明确说明:是的,身份分配是线程安全的。


调用CMEDSeqGen::GenerateNewValue将下一个值分配给调用者,并由闩锁(轻量级同步对象)保护。它不受用户事务的影响,这意味着在回滚的情况下您最终可能会出现间隙。并发事务可以生成身份(和序列)值而无需等待锁定。

有关更多详细信息,请参阅对相关问题的回答。