同時にデータが更新されるとデータの整合性が取れなくなります。そのためデータを更新している際には他から更新の信号が来てもアクセスを禁止する処理が必要になります。この禁止する処理が排他制御と呼ばれます。
例えばA店舗とB店舗が会社全体の今月の売り上げ合計データを更新していたとします。更新前には100万円でした。A店舗では10万円売り上げが上がったので110万円として更新ボタンを押しました。B店舗では20万円売り上げが上がったので120万円として更新ボタンを押しました。データベースは一つしかなく、同時にこの信号が来た場合、どちらかのみを反映してもデータは正確になりません。またどちらかが上書きされてもデータは間違っていますよね?なのでA店舗からデータ更新が来て更新している最中はB店舗からの信号を一時的に止めるという処理が発生するのです。これを排他処理と呼びます。
共有ロック
共有ロックされたデータは
◯読み出すことができます
X書き込むことができません
専有ロック
専有ロックされたデータは
X読み出すことができません
X書き込むことができません
デッドロック
共有ロックと専有ロックが絡み合い複数のトランザクション(データベースにおける一連の処理)がお互いにロックをかけて固まることがあります。これをデッドロックと呼びます。
共有ロック同士は成立する
トランザクション1とトランザクション2があって1が先に実行されているとします。その中で共有ロックと専有ロックを掛け合った時には以下のような動きになります。
トランザクション1 | トランザクション2 | 実行結果 |
共有ロック | 共有ロック | ◯成功 |
共有ロック | 専有ロック | X失敗 |
専有ロック | 共有ロック | X失敗 |
専有ロック | 専有ロック | X失敗 |
これ問題でも出てくるので実際の問題も見てみましょう。
過去問題
![](https://www.xn--4grr4jzer0z13b8ydc6hw8c14slx0cfdtdwftp3d.website/wp-content/uploads/2024/02/スクリーンショット-2024-02-04-11.51.12-1024x516.png)
前述の表に照らし合わせて考えるとアが正解だとわかります。
コメントを残す