1. 排他制御とは?
排他制御とは、データベースを操作する際、不都合が起きないようにコントロールするデータベースの仕組みの一つです。
具体的には、複数人が同時に同じデータを操作しようとした際に、順番待ちをさせる仕組みです。
データベースも機械ですので、原則として使う人の操作指示に従って動きます。
しかし、データベースを使う人は1人ではありません。
場合によっては、複数人から同時に指示されることがあります。
複数人から同時に指示された場合に、データベースで不都合が生じる場合があります。
例えば、あなたが10人から同時に別の相談を受けたとします。あなたが聖徳太子でなければ、10人それぞれに適切に回答することは難しいと思います。
10人の相談を1人ずつ順番に聞けば、順番に適切な回答をしていくことができます。「1人の相談を聞いている時は、他の9人の相談は待ってもらう」ことをデータベース上で実現するための仕組みが排他制御です。
2. 排他制御を行う目的
データベースは、排他制御を行うことでデータがおかしくならないように管理しています。
データベースが排他制御機能を持っていないと、あなたの通帳残高が正しくない金額になってしまったり、お店の売り上げが実際の売り上げと異なって表示されてしまったりします。
例えば、あなたが30万円入った口座にお給料が10万円入ると同時に、クレジットカード会社から5万円の引き落としがあったとします。
正しい口座残高としては、30万円+10万円-5万円=35万円ですが、お給料の入金が正しく処理されず、30万円-5万円=25万円となってしまう可能性があります。
お金関係のデータが不正確なことは、日常生活で非常に困ると思います。
お金関係以外でもデータが正しく表示されない状態では、データベースを使う意味がありません。
排他制御はデータベースにおける必須機能です。
3. 排他制御の仕組み
排他制御の具体的な仕組みについて、詳しく見ていきます。
1. 排他制御の仕組み
排他制御では、複数の人が同時に同じデータを操作しようとした際に、トラブルが起きないようにする仕組みのことです。
具体的には、データベースの「ロック」を用いることで、排他制御を行っています。
ある人がデータベースに対して操作している時には、他の人がデータベースに操作できないようにデータベースを「ロック」しておきます。
複数人から同時に操作指示が来てしまうと、データベースは混乱してしまい、間違った結果を生んでしまう可能性がありますが、1つ1つ順番に操作指示が来れば、データベースは指示に従って処理を進めることができます。
操作指示の割込みが起きないようにデータベースを一時的にロックすることで、データベースが指示を正確に処理できる順番形式に直しているわけです。
占有ロックと共有ロック
ロックには種類があり、代表的なものとして、占有ロックと共有ロックがあります。
占有ロックは、処理中の操作が終わるまで順番待ちしている操作者には何もさせないロック方法です。
共有ロックは、順番待ちしている操作者に対して、データベースを書き換える作業はさせないけれど、データベースを見ることは許可するロック方法です。
例えば、Excelの「読み取り専用で開く」が共有ロックにあたります。
ある人がExcelファイルを編集中、他の人が同じファイルを開こうとすると、「読み取り専用で開きますか?」と聞かれることがあります。Excelファイルを読み取り専用で開くとデータを見ることはできるけれど、書き換えることは出来ない状態となります。
2. デッドロック
データベースでロックを利用して、排他制御を行っていると、デッドロックという問題が起きる場合があります。
デッドロックとは、複数の処理同士がお互いにロックし合ってしまって、永遠に処理が完了しなくなってしまう状態のことです。
具体的には、処理1「口座Aから1万円を引く→口座Bに1万円を追加」と処理2「口座Bから2万円を引く→口座Aに2万円を追加」という処理がほぼ同時に実行されたとします。
処理1が「口座Bに1万円を追加」しようとしたとき、処理2が「口座Bから2万円を引く」作業をしていた場合、口座Bは処理2によってロックされているので、処理1は「口座Bに1万円を追加」することができません。
処理1は口座Bに1万円を追加できずに止まってしまいます。
つまり、口座Aをロックした状態で止まってしまうわけです。
一方で、処理2が「口座Bから2万円を引く」作業を終えて、「口座Aに2万円を追加」しようとしたとき、処理1が口座Aをロックしたまま止まってしまっているので、処理2も口座Aに2万円を追加することができず、口座Bをロックしたまま止まってしまいます。
このように、処理同士がお互いをロックしあって、どちらも進めなくなってしまう状態をデッドロックと言います。
4. まとめ
データベースにおける排他制御については、以下を覚えておくようにしましょう。
- 複数人が同時に同じデータにアクセスした際に、データの不整合が発生する場合がある
- データの不整合が発生しないために、排他制御を行っている
- 排他制御は処理をロックすることで実現している
- タイミングによっては、処理同士がデッドロック状態となってしまう場合がある