【DB】楽観的排他処理(更新)

  • このエントリーをはてなブックマークに追加

楽観的排他制御とは、データ更新時に制御を掛けることによりデータの統合性を保証する方法です。更新対象のデータが取得時と同じ状態と判断するため、Versionカラムを使用し、Versionの値が同じ場合のみ更新します。データの同時更新を防ぐために必要な制御で、DBの更新・削除をする際には必ず必要となる制御です。

  1. 楽観的排他制御とは
  2. 下準備
  3. 楽観的排他制御を利用しない場合の更新処理
  4. 楽観的排他制御を利用した場合の更新処理

※EntityFramwork Coreを利用してDBアクセスを行っています

 1. 楽観的排他制御とは

共有データに対して複数アクセスがあると、下記の図のようにデータの不整合が発生する場合があります。人事部社員Aは「備考:入社4年目」と変更しましたが、人事部社員Bが「備考:入社5年目」と上書きしてしまいました。

楽観的排他制御とは、データ更新時に制御をかけることによりデータの統合性を保証する方法です。更新対象のデータが取得時と同じ状態と判断するため、Versionカラムを用意し、Versionの値が同じ場合のみ更新処理を行います。

 2. 下準備

.Net CoreのWebアプリからEntityFrameworkを利用してDBのデータ更新を行い、楽観的排他制御の必要性を確認します。ASP.NET CoreでEntityFramwork Coreを利用してDBにアクセスしてデータ取得・変更する方法はこちらの記事で説明しています。

上記の記事では下記のようなフォーム画面からDBアクセスを実行し、社員の備考を編集する画面作成が行えます。

 3. 楽観的排他制御を利用しない場合の更新処理

異なる社員が同じタイミングで社員編集画面を開き、社員データの変更を行ったと想定します。他の社員がデータを変更したタイミングは分からないため、画面を再読み込みすること無く、他の社員が変更したデータを上書きしてしまいます。

 4. 楽観的排他制御を利用した場合の更新処理

更新対象のデータが取得時と同じ状態と判断するためにVersionカラムを用意し、Versionの値が同じ場合のみ更新処理を行います。そのため、Versionカラムを社員に追加し、画面にVersion情報を埋め込むようにViewを変更します。

●Entityクラス(社員クラス)

●View

第3章と同じ手順で、異なる社員が同じタイミングで社員更新を実行したと想定します。

テーブルに登録してあるVersion値と画面に埋め込んであるVersion値が異なるため、「テーブル更新中に例外が発生しました」という画面が表示されます。

ModelにVersionカラムを追加することで、データ更新時に制御を掛けてるデータの統合性を保証することができます。データの統合性を保証するためにも楽観的排他処理は必ず行うようにしましょう。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*