###前提・実現したいこと
- java7
- jdbc
- postgresql
初歩的な質問で恐縮です。
以下の様なテーブルAとテーブルBがあり、
テーブルAにデータを追加していき、テーブルBの件数を更新しようとしています。
テーブルA
id | グループ名 |
---|---|
1 | aaa |
2 | bbb |
3 | aaa |
4 | aaa |
テーブルB
グループ名 | 件数 |
---|---|
aaa | 3 |
bbb | 1 |
以下の様に処理を記載しました。
1.トランザクションを開く(Connection.setAutoCommit(false))
2.テーブルAへの行追加SQLを実行(insert テーブルA)
3.テーブルBに件数を反映する集計SQLを実行(update テーブルB set ... from(select ... from テーブルA))
4.コミット(Connection.commit())
処理が1つだけ(直列)の場合は上記でうまくいくのですが、並列で実行した場合、
行追加は全て行われるのですが、集計SQLの結果がテーブルAの状態と合致しなくなります。
■例:10並列で処理を実行
テーブルAのレコード数⇒10件
テーブルBの件数フィールド値⇒7
※この場合、本来は10に更新したい
###試したこと
Connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE)
を指定してみましたが、同時更新のため直列化アクセスができませんでした(当然ですが...)
###困っていること
最新の結果が反映されるようにしたいのですが、どういったアプローチをすればいいのかわかりません。
補足条件:テーブル構成は変更できません
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/14 09:15