複数のテーブルにインサートするときに、インサート中のテーブルをロックしたいです。
テーブルA
id(自動採番)
name(手動)
テーブルB
id(テーブルAから一番大きいidをセット)
data(本日の日をセット)
というような2つのテーブルがあります。
テーブルAとテーブルBは同じ人のデータなので、同じidを入れたいです。
maxで一番大きいものを取得したら最新のもので同じものがセットできるだろうという事で、テーブルBのidには、テーブルAから一番大きいidを持ってきてセットしています。
@Transactional
public insert(){
insert1インサート
insert2インサート
}
insertにトランザクションを貼っており、insert1かinsert2、どちらかが失敗したらロールバックされて両方インサートされないようになっています。
成功したら、insert1とinsert2の両方にデータがインサートされます。
DBに登録される事も確認でき、例外をだすとDBに登録されない事も確認できました。
トランザクションが出来たんだと喜んでいたんですが、insert2の箇所にブレイクポイントをつけてデバックモードで起動し、insert2で止まったときにコマンドプロンプトからinsert1にもinsert2にも直接データが書き込めてしまいました。
トランザクション中は自動でテーブルにロックが掛かるかと思ったのですがそんなこともなく・・・
排他ロックで調べて色々試しましたが、どれもうまくいきませんでした。
試したこと
・org.springframework.data.jpa.repository.Lockでアノテーションでロックを掛ける
・synchronized
テーブルAを登録して、自動採番されたものをテーブルBで使用するので、一番大きいのを持ってくるしか方法が思い浮かばず、でもテーブルにロックが掛かってないと、途中で別のデータが入ってきたらテーブルBに入れたいidが変わってきてしまいます。
@Transactionalを使っているときのテーブルのロック方法をご存知でしたら教えていただきたいです。
どうぞよろしくお願いします。
使用しているもの
eclipse:2018-09
MySQL:8.0.13
Springフレームワーク
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。