2013-09-13 3 views
0

WebSphere 7 및 OpenJPA에 대해 작업합니다. 실행 후메소드 완료 후 중첩 트랜잭션이 잠금을 해제합니까?

<persistence-unit name="ASAP_Main"> 
    <jta-data-source>jdbc/ASAPDB</jta-data-source> 
    <properties> 
      <property name="openjpa.Optimistic" value="false"/> 
      <property name="openjpa.ReadLockLevel" value="none"/> 
      <property name="openjpa.WriteLockLevel" value="none"/> 
      <property name="openjpa.LockManager" value="pessimistic(VersionCheckOnReadLock=false,VersionUpdateOnWriteLock=false)"/> 
      <property name="openjpa.LockTimeout" value="20000"/> 
    </properties> 
</persistence-unit> 
@PersistenceContext(unitName = "ASAP_Main") 
    private EntityManager em; 

    @MessageDriven 
    public class A implements MessageListener { 
     @EJB 
     private B b; 

     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void onMessage(Message message) { 
      b.processWithLock(message.getObject()); 
     ... 
     } 
    } 

    @Stateless 
    public class B{ 
     @TransactionAttribute(TransactionAttributeType.REQUIRED) 
     public void processWithLock(Object obj){ 
     em.lock(obj) 
     ... 
     } 
    } 

하는가가 processWithLock 분리 잠금 :

여기 persistance.xml 두 콩, 부분입니까?

+0

여기서 'entityManager'는 어디에서 왔습니까? 'persistence.xml'을 보여주십시오. 'processWithLock'의 완전한 소스를 추가하십시오. – Beryllium

+0

관련없는 댓글이지만 ...이 모든 주석. 이 모든 생각이 계속 이어지고 있습니다. 저는 JPA로 시작하고 있습니다 만, 이런 식으로 데이터를 관리하기위한 성능 세금은 너무 높아야 할 것 같습니다. – scottb

+0

@Beryllium 내 게시물을 편집 해 주셔서 감사합니다. 엔티티가없는 persistance.xml을 추가했습니다. –

답변

1

귀하의 MDB는 트랜잭션 경계를 정의하고 BA으로 시작되는 트랜잭션에 그냥 참여합니다. 중첩 변환은 다른 것입니다.

트랜잭션이 커밋되거나 롤백 될 때까지 모든 데이터베이스 잠금이 유지됩니다. .onMessage()가 반환됩니다. 따라서 processWithLock은 실행 후 글로벌 트랜잭션 내에서 호출 될 때 잠금을 해제하지 않습니다.

+0

답변을 주셔서 감사합니다. processWithLock에서 잠금을 해제하려면 REQUIRES_NEW 주석을 넣어야합니까? –

+0

'REQUIRES_NEW'는 주석 처리 된 메소드를 새로운 별도의 트랜잭션으로 실행합니다. 그래서 예, 메서드가 반환되면 잠금이 해제됩니다. 그러나 MDB와 EJB의 트랜잭션은 서로 독립적입니다 (하나는 실패하고 롤백 할 수 있고 다른 하나는 성공하거나 그 반대의 경우도 마찬가지입니다). 너의 경우에는 괜찮을지도 모른다. –