2015-01-11 2 views
1

제 질문은 여러 EJB 메소드가 호출되는 경우 JSF Bean에서 UserTransaction을 정의해야한다는 것입니다. 이 내 일반적인 시나리오입니다 :여러 EJB 메소드가 호출되는 경우 트랜잭션이 필요합니까?

//jsf bean... 
@EJB ejb1; 
... 
public String process(businessobject) { 
    ejb1.op1(businessobject); 
    ejb1.op2(businessobject); 
    .... 
} 

방법 (세척 및 분리 포함) 같은 복잡한 JPA 엔티티 빈 객체를 조작 모두 EJB를. ejb1.op2()가 호출되기 전에 ejb1.op1()이 호출 될 때 복제 된 곳에서 @oneToMany 관계 중 일부가 내 엔터티 빈을 형성한다는 것을 데이터베이스에서 인식했습니다. 두 ejbs가 새 트랜잭션을 시작한다는 것을 알고 있습니다. 그리고 나에게 지금까지는 아무 것도 괜찮아 보인다. 하지만이처럼 내 JSF 방법에 UserTransaction을 추가하면 JSF 코드는 제대로 작동 : 나는 모두 EJB가 하나 UserTransaction을로 호출을 캡슐화 할 필요가 있다고 기대하지 않았다

//jsf bean... 
@Resource UserTransaction tx; 
@EJB ejb1; 
... 
public String process(businessobject) { 
    try { 
    tx.begin(); 
    ejb1.op1(businessobject); 
    ejb1.op2(businessobject); 
    finaly { 
     tx.commit(); 
    }.... 
} 

. 왜 이것이 필요한가?

답변

2

@Stateless 클라이언트 (실제로는 JSF 관리 Bean)의 EJB 메소드 호출은 실제로 기본적으로 하나의 전체 트랜잭션으로 간주됩니다. 이것은 EJB 메소드 호출이 돌아올 때까지 지속됩니다. 중첩 된 EJB 메소드 호출을 포함하는 이 있습니다.

단일 트랜잭션을 나타내야하는 경우 단일 EJB 메소드 호출로 이들을 병합하면됩니다.

public void op1op2(Entity entity) { 
    op1(entity); 
    op2(entity); 
} 

클라이언트에서 UserTransaction 바이올린 필요없이

public String process(Entity entity) { 
    ejb1.op1op2(entity); 
    // ... 
} 

. 잘 설계된 JSF 기반의 클라이언트 애플리케이션에서는 결코 그럴 필요가 없습니다.

트랜잭션의 이유는 엔티티에서 비즈니스 조치를 수행하는 경우 DB를 잠급니다. 실수로 두 가지 명백하게 종속 된 비즈니스 활동을 완전히 개별적으로 수행했기 때문입니다. 이것은 높은 동시성 시스템에서 실제로 발생한 DB 상태를 손상시킬 수 있습니다. 설명에 대한 When is it necessary or convenient to use Spring or EJB3 or all of them together?

+0

감사 : 거래의이 좋은 읽을 수 있습니다 이유에 관해서는

. 그게 정확히 내가 의심 한 것입니다. 호출을 하나의 ejb 메소드/트랜잭션으로 모으겠습니다. 매우 드물게 발생했던 이상한 행동은 이제 사라졌습니다. 저는 항상 JSF 메소드가 새로운 트랜잭션 컨텍스트를 시작한다고 생각했습니다. – Ralph

1

사용자 트랜잭션이 필요합니까? 일반적으로 컨테이너로 관리되는 트랜잭션은 충분하고 목적을 충족시킵니다.

사용자 관리 트랜잭션이 필요한 경우에도 트랜잭션 관리 논리를 JSF 논리와 혼합하는 것은 좋지 않습니다.

컨테이너 관리 트랜잭션을 사용하려면 EJB에서 @TransactionAttribute를 사용해야합니다.

ejb의 모든 메소드가 동일한 레벨의 트랜잭션 지원을 필요로하는 경우, 클래스 레벨에서 주석을 가질 수 있습니다. 그렇지 않으면 각 개별 ejb 메소드에 대해 @TransactionAttribute 주석을 사용할 수도 있습니다.

관련 문제