2009-10-08 47 views
0

我試圖完全理解與CMT的JTA分界。我遇到的行爲是,在EJB上只有該方法的第一個@TransactionAttribute受到尊重,而對具有不同@TransactionAttribute註釋的同一個bean的後續方法調用則不是。尊重CMT的JTA事務劃分究竟在哪裏?

例子:

@Stateless 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public class Foo implements IFoo { 

    @EJB 
    private IBar barBean; 

    // inherits class transaction annotation of NOT_SUPPORTED 
    public void doSomething() { 
     barBean.doAction(); 
    } 
} 

@Stateless 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public class Bar implements IBar { 

    public void doAction() { 
     Entity entity = bar.find(); 
     entity.setName("new name"); 
     // fails with EJBException with TransactionRequiredException as cause 
     save(entity); 
    } 

    public Entity find() { 
     // return some persisted entity. 
     return em.findById(1); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public Entity save(entity) { 
     em.persist(em.merge(entity)); 
     em.flush(); 
    } 
} 

我所看到的行爲是Bar.save()拋出一個TransactionRequiredException。因此,這告訴我在save()上設置的REQUIRED註釋不會創建事務。 REQUIRES_NEW也不起作用。如果我將save()移動到另一個EJB,它將按預期工作。

這是否意味着只有第一個TransactionAttribute註釋被尊重,而不管後續的方法調用與不同的註解值相同?這是一個錯誤還是預期的行爲?我似乎無法找到具體說明這一點的任何文件。我很欣賞這方面的任何見解。

我的堆棧: EJB 3.0, Toplink的要點, GF V2UR2

回答

2

我的EJB 3規範的讀數是對單個方法的交易規範將覆蓋的EJB作爲一個整體的。因此,您所期望的要求應該適用,但似乎是合理的,但是...

只有在您使用bean方法作爲EJB時纔會這樣。當您從一個業務方法doAction()直接調用另一個業務方法save()時,您沒有使用EJB引用,因此這只是普通的舊Java - 容器不涉及,因此容器不可能介入。

如果你應用所需的選項給你的doAction()方法,我希望這個工作。

該理論與您對重構對另一個EJB的影響的發現一致。

+0

djna - 謝謝你的迴應。你的解釋是有道理的。我能夠與另一位同事聯繫,他同意你的發言。我感謝你的時間。 – Hoon 2009-10-09 18:08:53