ロック(lock)
排他制御とは
排他制御とは、共有資源に対して複数のアクセスが同時に発生しても問題なく動作できる制御のことをいいます。
例えば、次のように複数の人が同時に共有資源であるファイルに書き込みを行った場合、排他制御をおこなっていれば、データの整合性が保たれます。(共有ファイルに「BBB」と「CCC」が両方追加される)
しかし、排他制御をおこなっていないと次のように整合性が保たれないデータになってしまう危険性があります。(後から更新した方のデータとなり、BBBが反映されていない)
このような事態を防ぐために、共有ファイルへの書き込みが行われている間は、他者の書き込みを禁止するという制御を行います。この制御のことを排他制御といいます。
排他制御の代表的な手法の1つとしてロックがあり、ロックには「共有ロック」と「占有ロック」があります。
スポンサーリンク
占有ロックとは
占有ロックとは、データがロックされている間は、他ユーザはデータを読むことも、書き込むこともできないロックのことです。
例えば、次のように商品番号「S001」のレコードを占有ロックします。占有ロック中は他ユーザがそのレコードに対して読み書きすることはできません。(ロック解除待ちで待機になる)
このように対象レコードを占有し、ロック中は他ユーザに読み書きさせないロックのことを「占有ロック」といいます。
共有ロックとは
共有ロックとは、データがロックされている間は、他ユーザはデータを読むことはできるが、書き込むことができないロックのことです。
例えば、次のように商品番号「S001」のレコードを共有ロックします。共有ロック中でも他ユーザがそのレコードを読むことはできます。ただし書き込むことはできません。(ロック解除待ちで待機になる)
このように対象レコードに対し、ロック中は他ユーザに書き込みさせないロックのことを「共有ロック」といいます。
デッドロック
ロック機能を使う場合、注意しなければいけないことがあります。それが「デッドロック」です。
デッドロックとは、複数のトランザクションがお互いに相手の使いたいデータをロックしてしまい、お互いがロック解除待ち状態となり、処理が止まってしまう現象のことです。
以下は、デッドロックのイメージ図です。
- タスクAが資源AのDBをロック
- タスクBが資源BのDBをロック
- タスクAが資源BのDBにアクセスするも、ロック中のためロック解除待ちとなり待機
- タスクBが資源AのDBにアクセスするも、ロック中のためロック解除待ちとなり待機
上記のように、タスクA、タスクBともに「ロック解除待ちで待機」というステータスとなり、お互い処理が止まっています。この現象がデッドロックです。
デッドロックが発生した場合、いずれかのトランザクションを強制的にキャンセルする必要があります。