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