ブロッキングチェーンを勉強しています。
仮想通貨とか分散型台帳技術の方が検索で引っかかるけど
それとはちょっと違う話。
What is "ブロッキングチェーン"?
SQLServer でちょいちょい起こるロック待ちの連鎖のこと。
SQLServer の ロック思想上、ロック待ちは必ず発生するのでそれ自体は問題ない。
が、長いこと リソースをロックされているといろいろ困る、というかすごい困ってる。
すべてはロック思想の違いによる
このあたりの挙動は同じく商用 DB である Oracle と比べると理解しやすい。
以下、いろいろ参考記事
-
DBMS のロック・分離戦略と同時実行制御 - マイクロソフト系技術情報 Wiki
多バージョン法とロック法の項目を参照
READ COMMITTED ・・・ COMMIT 済みのデータだけを読み取る
SQL Server および Oracle のデフォルト設定
トランザクション分離レベルが"Read Commited"の場合 例えば、あるテーブルに対してデータ更新中のときにデータ参照を行うと
| SQLServer の場合 | データ更新中?てことはコミットが済んだらそいつが最新データか。よっしゃちょっと待っとくわー | | ---------------- | ------------------------------------------------------------------------------------------------ | | Oracle の場合 | データ更新中?まぁでも既にコミット済みのあるじゃん、もらってくよー |
といった感じの動きになる。
まとめ
snapshot オプションを ON にすると Oracle ぽい挙動になるとか
最近の SQLServer だとインメモリでよろしくできるらしい。
でも、ほいほいオプション変えたりバージョン上げたりは難しいので
更新系のトランザクションを短くするとか
ロックタイムアウト値を設定するなどでがんばるしかない。頑張る。