JPAの勉強のためにWebアプリケーションを作成しております。
開発をしていてDAOクラスでのJPAを使用しての複数テーブルのテーブルロック(Lock Tables~Write)はできるのかという問題に直面しました。
仮会員テーブルと本会員テーブルという2つのテーブルがあります。
仮会員テーブル:会員登録完了までお客様情報を保持するためのテーブル。会員登録が成功すると必要な情報を本会員テーブルに移してレコードを削除する(主キーは仮会員IDカラム)
本会員テーブル:会員登録後にメインで使用するお客様情報テーブル(主キーは会員IDカラム)
両方のテーブルに親子関係(外部キー制約)を設定していない。(会員登録処理が完了すると本会員テーブルに情報を移して仮会員テーブルからレコードを削除するため)
■処理の流れ(JPAについて勉強中のため、記載内容や処理の流れにおかしい点があればご指摘いただけると嬉しいです。)
①会員登録ボタンを押下
↓
②サーブレットからDAOクラスを呼び出す
↓
③仮会員IDを生成
↓
④仮会員テーブルからレコード全件を取得し、ID重複チェックを行う
↓
⑤さらに本会員テーブルからレコード全件を取得し、ID重複チェックを行う
↓
⑥トランザクション開始[EntityManager.getTransaction().begin()]
↓
⑦仮会員テーブルと本会員テーブルに対してテーブルロックを行う(可能であれば同時に)
↓
⑧生成したIDと必要な情報を仮会員テーブルと本会員テーブルに挿入する
↓
⑨テーブルロックを解放する
↓
⑩コミットする[EntityManager.getTransaction().commit();]
★両方テーブルロックを取得する理由:
ID重複チェック以降~レコード挿入間で本会員テーブルもしくは仮会員テーブルに同じIDで不正にレコードが挿入されることを防ぐため。両方テーブルロックをかけておくことでデータの整合性が取れるのとデータの不正挿入を防ぐため。
EntityManagerを使って複数のテーブルに対してテーブルロックをかけてコミットすることは可能でしょうか?事前に参考となるソースコードを探してみましたが参考となるページが見つかりませんでした。JPAを使用してのDBアクセスが得意な方、詳しい方がいましたらご回答をいただけないでしょうか?
使用DB:MySQL
DBへのアクセス方法:JPA(EntityManager)
回答2件
あなたの回答
tips
プレビュー