web-dev-qa-db-ja.com

並行性、マルチスレッド、並列処理のID列

当社はその影響を理解したいと考えています。

  • 主キーID列を持つ単一のテーブルがある場合、int主キーIDENTITY(1,1)、

  • アプリケーションはマルチスレッド並列処理を実行しており、1つのテーブルで数千の同時挿入を実行しようとしています。

たとえば、プロセッサが同じID番号を入力しようとしているなど、何らかの方法で主キー違反が発生すると、ID主キー列は失敗しますか?

または、SQLはマルチスレッドの並列挿入でも成功するように設計されていましたか?

注:IDENTITY_INSERTはオフです

2
user129291

IDの主キー列が失敗し、何らかの方法で主キー違反が発生しますか?例:プロセッサーが同じID番号を入力しようとしていますか?

これは、SQL Server製品ドキュメントで説明されています。

CREATE TABLE (Transact-SQL) IDENTITY (Property)

ID列は、キー値の生成に使用できます。列のIDプロパティは、以下を保証します。

  • 新しい値はそれぞれ、現在のシードと増分に基づいて生成されます。
  • 特定のトランザクションの各新しい値は、テーブルの他の同時トランザクションとは異なります。

2番目のポイントは、必要な保証です。

これは、SQL Serverに同時にアクセスするユーザープロセスまたはスレッドの数に関係なく有効です。

明示的に述べると、はい、ID割り当てはスレッドセーフです。


CMEDSeqGen::GenerateNewValueを呼び出すと、次の値が呼び出し元に割り当てられ、ラッチ(軽量同期オブジェクト)によって保護されます。これはユーザートランザクションの影響を受けません。つまり、ロールバックの場合にギャップが生じる可能性があります。並行トランザクションは、ロックを待たずにID(およびシーケンス)値を生成できます。

詳細については、関連する質問の my answer を参照してください。

9
Paul White 9