[Seasar-user:22006] 一意制約違反発生時の更新処理について

あきやまじろう [E-MAIL ADDRESS DELETED]
2014年 12月 8日 (月) 19:02:32 JST


お世話になっております。あきやまと申します。

一意制約違反発生時の更新処理について教えてください。

[動作環境]
・S2Container 2.4.45
・PostgreSQL 9.0.13

現在、以下の処理を実装しようとしていますが、

1.トランザクション開始(トランザクションA)
2.SELECT FOR UPDATEでAテーブルからレコードを取得
3.トランザクション開始(トランザクションB)
4.BテーブルのレコードをSELECT FOR UPDATEで取得
→取得できなかった場合、レコードを登録
→一意制約違反が発生した場合、レコードを更新
5.トランザクションBをコミット
6.CテーブルのレコードをSELECT FOR UPDATEで取得
→取得できなかった場合、レコードを登録
→一意制約違反が発生した場合、レコードを更新
7.トランザクションCをコミット
8.トランザクションAをコミット

項番4で一意制約違反が発生した場合にレコードを更新したいのですが、
「既にロールバックとしてマークされています」とログ出力され、更新できなくなり困っています。
項番1から8までをtry-catchして、項番1から再トライすれば、うまくいくのですが、
項番6でも一意制約違反の可能性があり、その場合try-catchをネストしないといけないので、できれば避けたいです。
何かいい対処方法があれば、ご教授の程よろしくお願いします。
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20141208/e028aee7/attachment.html>


Seasar-user メーリングリストの案内