排他制御(楽観的ロックと悲観ロック)
データに対して複数のアクセスが見込まれる場合に、同時アクセスにより不整合が発生することを防ぐため、あるトランザクションがデータにアクセスしている時は他トランザクションからはアクセスできないようにして直列に処理されるように制御すること。
具体的な方式としては楽観ロックと悲観ロックが代表的なものになる。
楽観的ロック
楽観ロックとは他者との同時更新は起きないであろうという楽観的な前提の排他制御。更新対象のデータが、データの取得時点から更新されていないことを確認し更新を行うことでデータの整合性を保証する。
データそのものに対してロックは行わずに、データにバージョン(あるいは最終更新日時)を管理するためのカラムを用意する。アプリケーションがデータを更新する際に、更新時の条件としてデータ取得時のバージョンとデータ更新時のバージョンが同じかを確認する。
悲観的ロック
悲観ロックとは他者との同時更新が起きるであろうという悲観的な前提の排他制御。更新対象のデータを取得時点から明示的にロックしてから更新することでデータの整合性を保証する。
「SELECT FOR UPDATE」を用いてデータを取得し他のトランザクションから更新されないようにする。アプリケーションがロックを管理するのではなく、SQLを用いるためデータベース(DBMS)がロックをかける。データはトランザクションがコミットまたはロールバックされるまで、他のトランザクションから更新されない。