Spring Boot DB連携

Spring BootでMyBatisを利用しSQL Serverに接続するアプリケーションで楽観ロックを利用してみた

これまでこのブログで、Spring BootでMyBatisを利用しDB更新するアプリケーションをいくつか取り上げてきたが、DB更新時に、楽観ロックを利用することもできる。

今回は、Spring BootでMyBatisを利用しSQL Serverに接続するアプリケーションで楽観ロックを利用してみたので、そのサンプルプログラムを共有する。

なお、楽観ロックを含む排他制御については、以下のサイトを参照のこと。
https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc

前提条件

下記記事の実装が完了していること。

Spring BootでSQL Serverに接続しMyBatisを利用してみた今回は、Spring Bootアプリケーションで接続するデータベースをSQL Serverに変更してみたので、そのサンプルプログラムを共...

また、SQL ServerのUSER_DATAテーブルに、以下の記事の「書き込み先テーブルのカラム追加」に記載のカラム追加が完了していること。

Azure Function上でCSVファイルのデータをDBに取り込むプログラムで楽観ロックを使ってみたこれまでこのブログで、Spring BatchのChunkモデルを用いて、Blob上のCSVファイルをDBのテーブルに書き込む処理を作成...

サンプルプログラムの作成

作成したサンプルプログラムの構成は、以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。

エンティティクラス・フォームクラスの内容は以下の通りで、カラム「VERSION」を追加している。

また、Mapperインタフェースの内容は以下の通りで、登録・更新・削除処理の戻り値(更新件数・int型)を返却し、指定したIDをもつデータを行ロックをかけ取得する処理を追加している。

さらに、Mapper XMLの内容は以下の通りで、VERSIONの更新処理や更新条件を追加したり、指定したIDをもつデータを行ロックをかけ取得する処理を追加したりしている。

また、サービスインタフェースの内容は以下の通りで、登録・更新処理や削除処理で戻り値(更新件数・int型)を返却するようにしている。

さらに、サービスクラスの内容は以下の通りで、更新・削除処理の直前にVERSIONの値をチェックし、チェックエラーの場合に楽観ロックエラーに設定している。

また、コントローラクラスの内容は以下の通りで、登録・更新処理で更新件数をチェックし、楽観ロックエラー・行ロックエラー・DB更新エラーの場合に、自画面にエラーメッセージを表示するようにしている。

さらに、メッセージプロパティの内容は以下の通りで、楽観ロックエラー・DB更新エラーのメッセージを追加している。

また、確認画面・削除確認画面の内容は以下の通りで、楽観ロックエラー・DB更新エラーの場合に、エラーメッセージを表示する処理を追加している。

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



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

サンプルプログラムの実行結果(正常時)

サンプルプログラムの実行結果(正常時)は、以下の通り。

1) 実行前のUSER_DATAテーブルの中身は、以下の通り。

サンプルプログラムの実行結果(正常時)_1

2) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)/」にアクセスすると、以下の画面が表示される。ここで「データ追加」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_2

3) 以下のように入力後、「確認」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_3

4) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_4

5) 以下のように、完了画面が表示される。ここで「一覧に戻る」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_5

6) この時点でのUSER_DATAテーブルの中身は以下の通りで、id=3のデータがVERSION=0で追加されていることが確認できる。

サンプルプログラムの実行結果(正常時)_6

7) 一覧画面の表示は、以下の通り。ここで、ID=3の「更新」リンクを押下する。
サンプルプログラムの実行結果(正常時)_7

8) 以下の内容に変更後、「確認」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_8

9) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_9

10) 以下のように、完了画面が表示される。ここで「一覧に戻る」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_10

11) この時点でのUSER_DATAテーブルの中身は以下の通りで、id=3のデータがVERSION=1で更新されていることが確認できる。

サンプルプログラムの実行結果(正常時)_11

12) 一覧画面の表示は、以下の通り。ここで、ID=3の「削除」リンクを押下する。
サンプルプログラムの実行結果(正常時)_12

13) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(正常時)_13

14) 一覧画面に戻り、以下のようにID=3のデータが削除されていることが確認できる。
サンプルプログラムの実行結果(正常時)_14

15) この時点でのUSER_DATAテーブルの中身は以下の通りで、id=3のデータ削除されていることが確認できる。

サンプルプログラムの実行結果(正常時)_15



ウズウズカレッジJavaコースはわかりやすい動画教材と充実した就業サポートで優良企業を目指せるプログラミングスクールだったJavaは、世界中で広く使われていて、現在の需要が高く将来性もある開発言語になります。 https://www.acrovision....

サンプルプログラムの実行結果(エラー時)

サンプルプログラムの実行結果(エラー時)は、以下の通り。なお、下図では更新時のエラーを表示しているが、削除時も同様にエラーメッセージが表示される。

1) 実行前のUSER_DATAテーブルの中身は、以下の通り。

サンプルプログラムの実行結果(異常時)_1_1

2) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)/」にアクセスすると、以下の画面が表示される。ここでID=2のデータの「更新」リンクを押下する。
サンプルプログラムの実行結果(異常時)_1_2

3) 以下のように変更後、「確認」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_1_3

4) 以下のSQLを実行し、入力画面を開いた時と違うVERSIONになるようにする。

サンプルプログラムの実行結果(異常時)_1_4

5) 4)のSQL実行後、ID=2のUSER_DATAテーブルのデータは以下のようになる。

サンプルプログラムの実行結果(異常時)_1_5

6) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_1_6

7) 以下のように、楽観ロックエラーになることが確認できる。
サンプルプログラムの実行結果(異常時)_1_7

8) 再度「http:// (ホスト名):(ポート番号)/」にアクセスすると、以下の画面が表示される。ここでID=2のデータの「更新」リンクを押下する。
サンプルプログラムの実行結果(異常時)_1_8

9) 以下のように変更後、「確認」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_1_9

10) 更新対象データに行ロックをかけるため、トランザクションを開始する。
サンプルプログラムの実行結果(異常時)_1_10

11) 以下のSQLを実行し、更新対象データに行ロックをかける。

サンプルプログラムの実行結果(異常時)_1_11

12) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_1_12

13) 以下のように、DBロック取得エラーになることが確認できる。
サンプルプログラムの実行結果(異常時)_1_13

14) 更新対象データの行ロックを解除するため、トランザクションを終了する。
サンプルプログラムの実行結果(異常時)_1_14_1

サンプルプログラムの実行結果(異常時)_1_14_2



「FlexClip」はテンプレートとして利用できる動画・画像・音楽などが充実した動画編集ツールだったテンプレートとして利用できるテキスト・動画・画像・音楽など(いずれも著作権フリー)が充実している動画編集ツールの一つに、「FlexCli...

サンプルプログラムの実行結果(更新件数エラー時)

サンプルプログラムの実行結果(更新件数エラー時)は、以下の通り。なお、下図では更新時のエラーを表示しているが、削除時も同様にエラーメッセージが表示される。

1) 以下のように、バージョンが異なっている場合にエラーにする処理をコメントアウトする。
サンプルプログラムの実行結果(異常時)_2_1

2) 実行前のUSER_DATAテーブルの中身は、以下の通り。

サンプルプログラムの実行結果(異常時)_2_2

3) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)/」にアクセスすると、以下の画面が表示される。ここでID=2のデータの「更新」リンクを押下する。
サンプルプログラムの実行結果(異常時)_2_3

4) 以下のように変更後、「確認」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_2_4

5) 以下のSQLを実行し、入力画面を開いた時と違うVERSIONになるようにする。

サンプルプログラムの実行結果(異常時)_2_5

6) 5)のSQL実行後、ID=2のUSER_DATAテーブルのデータは以下のようになる。

サンプルプログラムの実行結果(異常時)_2_6

7) そのまま「送信」ボタンを押下する。
サンプルプログラムの実行結果(異常時)_2_7

8) 以下のように、楽観ロックエラーになることが確認できる。
サンプルプログラムの実行結果(異常時)_2_8

要点まとめ

  • 画面上で楽観ロックを実装するには、登録・更新の直前でバージョンをチェックすると共に、登録・更新時の同一バージョンの更新件数が1件であることをチェックすればよい。