Sql-Server

並發、多執行緒、並行處理中的標識列

  • June 20, 2018

我們公司想了解影響:

  • 如果我們有一個帶有主鍵標識列的表,int primary key IDENTITY(1,1),
  • 並且應用程序正在進行多執行緒並行處理,試圖在一張表上同時進行 1000 次插入。

身份主鍵列是否會失敗,並且以任何方式違反主鍵,例如:處理器正在嘗試輸入相同的身份編號?

或者 SQL 是否設計為即使在多執行緒並行插入中也能成功?

注意:IDENTITY_INSERT 為 OFF

身份主鍵列是否會失敗,並且以任何方式違反主鍵,例如:處理器正在嘗試輸入相同的身份編號?

這在 SQL Server 產品文件中有所介紹:

CREATE TABLE (Transact-SQL) IDENTITY (Property)

標識列可用於生成鍵值。列上的標識屬性保證以下內容:

  • 每個新值都是根據目前的種子和增量生成的。
  • 特定事務的每個新值都不同於表上的其他並發事務。

第二點是你需要的保證。

無論有多少使用者程序或執行緒同時訪問 SQL Server,它都有效。

明確地說:是的,身份分配是執行緒安全的。


呼叫CMEDSeqGen::GenerateNewValue將下一個值分配給呼叫者,並受到鎖存器(輕量級同步對象)的保護。它不受使用者事務的影響,這意味著您最終可能會在回滾的情況下出現間隙。並發事務可以生成身份(和序列)值,而無需等待鎖定。

有關更多詳細資訊,請參閱對相關問題的回答。

引用自:https://dba.stackexchange.com/questions/185485