0

私は PostgreSQL で Spring を使用しており、次のようなコードを使用して一種の UPSERT を実行しようとしています。

jt.update("delete from A where id = 1")
jt.update("insert into A (id, value) values (1, 100)")

トランザクション内でラップされます ( を使用@Transactional)。

問題は、多くの同時リクエストがある場合、このコードが「重複キー」エラーで失敗することです。つまり、トランザクションが分離されていないか、または...

トランザクションの仕組みについて何か不足していますか? ここで別のメカニズムを使用する必要がありますか (例: スレッド同期)?

4

2 に答える 2

11

私はそれについてかなり大きなブログ投稿を書いたので、リンクに反対票を投じるかもしれませんが、これを読んでください.

要点は、トランザクションはここでは役に立たないということです (少なくともデフォルトでは)。正しい upsert を書くことは可能ですが、実際にはかなり注意が必要です。

于 2013-06-17T17:03:53.660 に答える