SQL Serverでオブジェクト構造を保護する為の仕組みにラッチとスピンロックというものがあります。
ラッチもスピンロックも短時間の間保持して他のスレッドからオブジェクトの多重更新などが
起きないように保護する仕組みです。
スレッド1がラッチを確保して例えばページ分割をしている最中にスレッド2が該当ページにアクセスすると
スレッド2はラッチ待ちをするためにYieldして後続のタスクを取り出します。
Yieldされて後回しになったタスクは後でまたスレッドに拾われてページアクセスします。
その頃にはラッチが解放されていることを期待できます。
OSで言えばセマフォやミューテックスのようなものです。
一方でスピンロックはYieldを行わないで待つ仕組みです。
ラッチのようにYieldするのではなく、そのままCPUを回しながらスピンロックが解放されるのを待ちます。
Yieldすることすらもったい無い(という表現がよいかは別として)状況で使います。
公式文書ではロックのパーティション分割に記載があります。
https://technet.microsoft.com/ja-jp/library/ms187504(v=sql.105).aspx
またスピンロックの競合については以下のホワイトペーパーがまとまっています。
http://download.microsoft.com/download/D/A/A/DAAD63AF-B06F-4F29-AF1D-68A78102ABF4/SQLServerSpinlockContention.pdf
スポンサードリンク
↧
スピンロックとラッチの違い
↧