悲観ロックと楽観ロックの違い

悲観ロック

複数ユーザーが同一のデータに頻繁に変更を加えるであろう、という悲観的な前提の排他制御。更新対象のデータを取得する際にロックをかけることで、他のトランザクションから更新されないようにする。

ロックされたレコードは、トランザクションがコミットまたはロールバックされるまで、他のトランザクションから更新されないため、データの整合性を保証することができる。

懸念点としてはロックされた状態でセッションタイムアウトやサーバーダウン等が発生すると、ロックされた状態のままになってしまい誰も編集できなくなってしまう可能性があること。そのため、ロック解放用の処理を用意したり、ロックの制限時間を設けたりする必要がある。

Image from Gyazo

楽観ロック

複数ユーザーが同一のデータを滅多に変更しないであろう、という楽観的な前提の排他制御。データそのものに対してロックは行わずに、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、データの整合性を保証する方式。

状態を確認する方法としてはVersionを確認するためのカラムを用意し、データ取得時と更新時のVersionを確認することでデータの整合性を補償することができる。

懸念点としては後から更新しようとしたが操作した内容が破棄されてしまい、出戻りが発生してしまう事などが挙げれる。

Image from Gyazo