1

JavaEEBeanマネージドトランザクションを使用するレガシーシステムの状況があります。LockAcquisitionException作成したばかりのものを取得しようとすると、スローされます。

私の最初の考えはこれでした:

@TransactionAttribute(SUPPORTS)
public Item retrieveItem(int id) {
 Item i;
 try {
   i = em.find(Item.class, id);
 } catch (PersistenceException e) {
   if (e.getCause() instanceof LockAcquisitionException) {
     i = retrieveItem(id);
   }
 }
 return i;
}

ただし、再帰呼び出しが行われたとき、トランザクションはすでに終了しており、新しいトランザクションは作成されていないようです。私は別の方法を試しましTransactionAttributesたが、違いはないようです。また、自分でトランザクションを管理しようとしましたem.getTransaction()が()、CMTでは違法です。

私はエレガントな修正を探していません-私が言ったように、これはレガシーです、私は数ヶ月ですべてが交換されるまでそれをトリアージする何かが必要です!

乾杯。

4

2 に答える 2

1

注釈を付けてみてくださいretrieveItem@TransactionAttribute(REQUIRES_NEW)新しいトランザクションで実行されます。

ご了承ください:

  1. 最初のものは無効化されており(ロールバック用に設定されています)、完了しません
  2. 2番目のトランザクション中、最初のトランザクションで行われた変更はとにかく表示されません

ですから、それがあなたのシナリオに合うかどうかはわかりません。しかし、元のトランザクションが無効になっている場合に操作を実行して正常にコミットすることがわかっているのは、これが唯一の方法です。

于 2010-06-30T18:39:58.737 に答える
0

残念ながら、これを行うために私が見つけることができる唯一の方法は、トランザクションの原因を修正することです-したがって、今はem.flush()の先頭でを実行していretrieveItem()ます。このアプリを交換するのが待ちきれません。

于 2010-07-01T12:31:06.823 に答える