ばったログ

3回に1回くらいはやったことをアウトプットしていく

ブロッキングチェーンを勉強しています。

仮想通貨とか分散型台帳技術の方が検索で引っかかるけど
それとはちょっと違う話。

What is "ブロッキングチェーン"?

SQLServer でちょいちょい起こるロック待ちの連鎖のこと。
SQLServer の ロック思想上、ロック待ちは必ず発生するのでそれ自体は問題ない。 が、長いこと リソースをロックされているといろいろ困る、というかすごい困ってる。

すべてはロック思想の違いによる

このあたりの挙動は同じく商用DBである Oracle と比べると理解しやすい。

以下、いろいろ参考記事
* DBMSのロック・分離戦略と同時実行制御 - マイクロソフト系技術情報 Wiki
多バージョン法とロック法の項目を参照

READ COMMITTED   ・・・   COMMIT 済みのデータだけを読み取る
SQL Server および Oracle のデフォルト設定

トランザクション分離レベルが"Read Commited"の場合 例えば、あるテーブルに対してデータ更新中のときにデータ参照を行うと

SQLServer の場合 データ更新中?てことはコミットが済んだらそいつが最新データか。よっしゃちょっと待っとくわー
Oracleの場合 データ更新中?まぁでも既にコミット済みのあるじゃん、もらってくよー

といった感じの動きになる。

まとめ

snapshot オプションを ONにするとOracleぽい挙動になるとか 最近のSQLServer だとインメモリでよろしくできるらしい。
でも、ほいほいオプション変えたりバージョン上げたりは難しいので
更新系のトランザクションを短くするとか
ロックタイムアウト値を設定するなどでがんばるしかない。頑張る。