楽観的排他制御(optimistic exclusive control)と悲観的排他制御(pessimistic exclusive control)は、両方の方法が大規模なスケーラビリティを持つため、システムの排他制御において非常に一般的な方法論です。
近年のWebシステムでは、特に楽観的排他制御が用いられることがほとんどです。本記事では、楽観的排他制御と悲観的排他制御のどちらが適しているのかを考察し、それらがシステム設計に及ぼす影響について説明します。
排他制御とは
排他制御は、同時に複数のスレッド/プロセス/ユーザーがデータを更新しようとする問題を解決するために使用されます。排他制御方法には悲観的排他制御と楽観的排他制御の2つの主要な方法があります。
悲観的排他制御(pessimistic exclusive control)
悲観的排他制御は、データ更新リクエストについての楽観的な予測を行わない方法です。つまり、一度に1人のユーザーしかデータを操作できないように、予約をすることで競合を回避しようとします。悲観的排他制御は、ロック機構やトランザクションを使用することが一般的です。
楽観的排他制御(optimistic exclusive control)
一方、楽観的排他制御は、データを更新する前に、競合を検出して回避するための最適な方法論を提供することにフォーカスしています。これは、別のユーザーがデータを更新したときに、その影響を判断することができるデータバージョン管理を含むことがよくあります。ユーザー操作中に競合が発生した場合、変更をロールバックするか、サーバから新しいデータを取得してマージするか選択できます。
楽観的排他制御では、競合を検出するためにバージョンまたは更新日時を使用することが一般的です。更新日時を使用する場合には日付の精度に注意が必要で、精度が低いと他ユーザーの更新を検出できない場合があります。
排他制御がシステムに与える影響
悲観的排他制御は、大規模なWebシステムのパフォーマンスに深刻な影響を与える可能性があります。つまり、トランザクションロックが長時間存在する場合には、他のトランザクションによってコミットされたデータに対して待たなければならず、それによって生じる遅延リスクがあります。一方、楽観的排他制御には、ユーザーが変更したい場合には非常に簡単であるため、パフォーマンスの限界に到達する前に、他のタイプの制御よりも多数のデータ更新を許容できます。
また、トランザクションが複数のデータをロックする場合、ロック順番に気をつけないとデッドロックが発生するリスクがある点についても注意が必要です。
楽観的排他制御は、特にオンラインWebアプリケーションにおいて、より親和性があると考えられています。ただし、その欠点が存在する場合があります。書き込みの競合性が高い場合、やはり悲観的排他制御で処理することが必要であるかもしれません。そしてこの場合、楽観的排他制御は厳密ではありません。Webアプリケーションには、トランザクション処理スレッド特有の問題も存在するため、慎重に検討する必要があります。
ただし、頻繁にデータ競合が発生する場合は、ユーザーの生産性やパフォーマンスに悪影響を与える場合があります。
アクセス制御による排他制御
楽観的排他制御とも悲観的排他制御とも異なるアプローチで排他制御を行うという選択肢もあります。
例えば、以下のような方法があります。
- データを更新する前にデータに対するロックを獲得し、ロックしているユーザーのみがデータを更新できるようにする
- ワークフローによってデータをユーザーに割り当て、割り当てられているユーザーのみが更新できるようにする
いずれの方法においても、ユーザーに与えて、アクセス権限を有しているユーザーだけが更新を行うことができるようにシステムを設計しています。これにより、更新時に排他制御を行わなくても安全にデータを更新することができるようになりますし、楽観的排他制御で安全に排他制御することができます。
結論
楽観的排他制御と悲観的排他制御は、両方とも重要な排他制御手法です。また、これら以外にも排他制御の手法はあります。システム環境、データ同期の頻度、書き込みの競合状況に応じて、適切な排他制御方法を選択し、最適な手法を使用することが重要です。
楽観的排他制御を使用することで、システムのパフォーマンスが向上し、ユーザーエクスペリエンスを向上させることができます。悲観的排他制御を使用することで、強力なトランザクション管理と競合回避制御を実現できます。
したがって、基本的には、両者が制御戦略の好みに応じて異なる選択肢であり、特定のシナリオと目的に基づいて使用されるべきです。