本を読んだ備忘録です!
排他制御
- 共有資源に対して複数のアクセスが同時に発生しても問題なく動作できる制御
排他制御の種類
- ロック
- 共有資源にロックをかけて同時にアクセスさせない方式。
- 悲観ロック
- 更新対象データを取得時にロックして他者が操作できないようにする方式
- 楽観ロック
- 同時アクセスはあまり起きない」という楽観的な考え方の排他制御
- 複数のトランザクションが同時に同じデータにアクセスしても競合が発生しないようにするための手法
- 悲観ロック
- 共有資源にロックをかけて同時にアクセスさせない方式。
- ニューテックス
- 「未使用」と「使用中」で判断し、共有資源を同時にアクセスさせない方式。
- セマフォ
- 同時にアクセスできる数を管理し、その人数までしか共有資源に対して同時にアクセスさせない方式。
楽観ロックの流れ(バージョン比較)
-
テーブルのカラムにバージョンを用意しておき、データ閲覧者にはバージョンを付与
-
データ更新時にバージョンがカウントアップされるようにする
バージョンがアップすることで、古いバージョンを付与されている閲覧者はデータを更新できない
*引用
https://medium-company.com/%e6%a5%bd%e8%a6%b3%e3%83%ad%e3%83%83%e3%82%af%e3%81%a8%e3%81%af/
- タイムスタンプ比較、前列データ比較など種類がある
- デメリットは、他社による更新が頻繁に行われるサービスには向いてない。なぜなら、滅多なことじゃ更新は起きないという前提だから
悲観ロックの流れ
- トランザクションがデータにアクセスする前に、先にアクセスしている他のトランザクションからデータが更新されていないかをチェックする。
- 更新されていた場合は、トランザクションはロックをかけることで他のトランザクションからのアクセスを制限する。
- ロックをかけることで他のトランザクションからのアクセスを制限し、データの整合性を保つ。
- トランザクションが処理を終了したら、ロックを解除することで他のトランザクションがデータにアクセスできるようにする。
*無理やり終了されると、ロック解除が検知できないので
例)ブラウザの×ボタン押下や、シャットダウン
管理者がロック解除できるロック解除画面
深夜にシステムが全ロックを解除する
同じユーザーからの再アクセスは許可
などの対策が必要
排他制御奥が深い。。。