2010-06-30 5 views
1

Java EE Bean Managed Transactions를 사용하는 레거시 시스템에 상황이 있습니다. 방금 만든 무언가를 검색하려고 할 때 LockAcquisitionException이 던져지고 있습니다.Java EE의 컨테이너 관리 트랜잭션 재발생

내 초기 생각이 있었다 :

@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에서는 불법입니다.

우아한 픽스를 찾고있는 것이 아닙니다. 제가 말했듯이 이것은 유산이며, 몇 달 만에 모든 것이 대체 될 때까지 분류 할 항목이 필요합니다.

건배.

답변

0

불행히도 내가 할 수있는 유일한 방법은 거래의 원인을 수정하는 것입니다. 이제 retrieveItem()의 시작 부분에 em.flush()을하고 있습니다. 이 응용 프로그램을 대체 할 때까지 기다릴 수 없어 ..

1

retrieveItem@TransactionAttribute(REQUIRES_NEW)으로 주석을 추가하십시오. 그러면 새로운 트랜잭션으로 실행됩니다.

참고 :

  1. 는 첫 번째 트랜잭션에서 변경된 사항을 볼 수 어쨌든
두 번째 거래 중 첫 번째가 무효화되어 있었다 (롤백 세트)과 의지 결코 완전한
  • 을하지 않습니다

    시나리오에 적합한 지 모르겠습니다. 하지만 원래 트랜잭션이 무효화 된 경우 작업을 수행하고이를 성공적으로 커밋하는 유일한 방법입니다.

  • +0

    고마워 .. 그걸 시도했지만 여전히 작동하지 않습니다. 나는 'Transaction not active'오류가 발생하여 주석을 집어 내고 있다고 확신하지 못합니다. : –

    +0

    @ Robert Wilson 제 실수로, BMT를 사용한다는 사실을 간과했는데,'UserTransaction'을 주입하고'em.getTransaction' 대신에 새로운 것을 시작/정지 할 수 있습니까? – ewernli