Spring Boot DB連携

Spring BootのWEB画面上で排他制御を実装してみた(ソースコード編)

今回も引き続き、排他制御の1つである「悲観的排他制御」を利用した実装について述べる。ここでは、具体的なサンプルプログラムのソースコードを共有する。

前提条件

下記記事を参照のこと。

Spring BootのWEB画面上で排他制御を実装してみた(完成イメージと前提条件)今回は、データ更新処理内に排他制御を加えてみたので、そのサンプルプログラムを共有する。 排他制御は、1つのデータに複数のアクセスが...

作成したサンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠は、前提条件に記載したソースコードと比較し、変更になったソースコードを示す。赤枠のソースコードについては今後記載する。

まず、ユーザーデータ(USER_DATA)テーブルにアクセスするMapperクラスは以下の通り。今回は、悲観ロックをかけてデータ取得するfindByIdForUpdateメソッドを追加していて、ここでは5秒待つようになっている。

なお、select ~ for update文についての詳細は、以下のサイトを参照のこと。
https://www.shift-the-oracle.com/sql/select-for-update.html



また、主要な処理を含むServiceImplクラスは以下の通り。createOrUpdateメソッド内で、更新時はMapperクラスのfindByIdForUpdateメソッドを呼び出し、その後10秒待機し、更新処理を行うようにしている。



また、コントローラクラスは以下の通り。データ更新を行うsendメソッド内で、WAITのタイムアウトエラー等が発生した場合は、システムエラー画面に遷移するようにしている。

また、今回追加したシステムエラー画面のHTMLソースは以下の通り。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-exclusive-2/demo

要点まとめ

  • select ~ for update文を実行することで、悲観ロックの取得が行える。
  • select ~ for update文には、「wait 秒数」や「nowait」オプションを付与することができる。