
面接官:排他制御(楽観ロック・悲観ロック)について説明してください。
私:排他制御とは、複数のトランザクションが同時に同じデータにアクセスする際に、データの整合性を保つための仕組みです。
例えば、ECサイトで在庫数を管理しているテーブルがあるとします。AさんとBさんがほぼ同時に同じ商品を注文した場合、在庫数が正しく減算されないと、在庫以上の注文を受けてしまう可能性があります。これを防ぐために排他制御が必要になります。
以前のプロジェクトで、複数のユーザーが同時に編集する可能性がある設定ファイルを管理するシステムを開発した際、楽観ロックを採用しました。
最初はロックせずに処理を進め、更新時にデータのバージョンを確認し、もし他のユーザーによって変更されていれば更新をロールバックするという仕組みです。これによって、無駄なロック時間を減らし、システムのパフォーマンスを向上させることができました。
また、別のプロジェクトで、銀行口座の残高を管理するシステムを開発した際には、悲観ロックを採用しました。
口座残高は絶対に誤りがあってはならないデータなので、トランザクション開始時にデータをロックし、他のトランザクションからのアクセスをブロックしました。これによって、データの整合性を最優先に保つことができました。
現役エンジニアによる深掘り解説
楽観ロック
メリット
ロックの取得処理がないため、システム全体のパフォーマンスを向上させやすい。
ロック待ちによるデッドロックが発生しない。
デメリット
更新時に競合が発生した場合、ロールバック処理が必要になり、処理が複雑になる場合がある。
競合が頻繁に発生する状況では、悲観ロックよりもパフォーマンスが悪化する可能性がある。
悲観ロック
メリット
データの整合性を厳密に保つことができる。
競合が発生した場合のロールバック処理が不要。
デメリット
ロックの取得処理が必要なため、システム全体のパフォーマンスが低下する可能性がある。
ロック待ちによるデッドロックが発生する可能性がある。
⚠️ 面接突破のワンポイント
- 「楽観ロックと悲観ロック、それぞれどのような状況で使い分けるべきか?」という質問に答えられるように、具体的なシナリオを想定しておきましょう。例えば、「ECサイトのカート機能」「銀行口座の残高更新処理」「ブログ記事の編集機能」などを例に、それぞれのロック方式の適性を説明できるように準備しておくと良いでしょう。
- 「排他制御におけるデッドロックとは何か?どのように回避するのか?」という質問に答えられるように、デッドロックの発生条件と回避策(タイムアウト、ロックの取得順序の固定など)を理解しておきましょう。図解などを用いて説明できると、より理解度が高いことをアピールできます。


