2013-10-09 53 views
1

我正在试验JTA事务,并且无法理解为什么标记为始终创建新事务的方法没有(代码被编辑为相关内容)。这是前一个问题,我问一个类似话题的重新工作(here):为什么新的JTA交易没有被创建?

@Stateless 
public class StaffEntityOps 
{ 
    @Resource TransactionSynchronizationRegistry txReg; 

    private void transactionStatus(String where) 
    { 
    String msg; 
    int stat = txReg.getTransactionStatus(); 
    switch (stat) { 
     case STATUS_ACTIVE: 
     msg = "Active"; 
     break; 
     case STATUS_NO_TRANSACTION: 
     msg = "No Transaction"; 
     break; 
     default: 
     msg = "Other: " + stat; 
    } 
    System.out.println("Transaction status in " + where + ": " + msg); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    private void saveToEM(EntityManager em, StaffEntity staffEntity) 
     throws ... 
    { 
    transactionStatus("saveToEM: "); 
    em.persist(staffEntity); 
    em.flush(); 
    } 

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void add(StaffEntity staffEntity) 
     throws ... 
    { 
    // Entity Managers emDB1 and emDB2 are injected into class. 
    transactionStatus("add: "); 
    saveToEM(emDB1, staffEntity); 
    saveToEM(emDB2, staffEntity); 
    } 

上面的想法,是调用add(StaffEntity staffEntity)方法坚持新StaffEntity到一组非XA数据源。我已经使用bean管理的事务解决了这个问题(前面的问题,上面引用的),还有XA-DataSources。我仍然想确定是否有办法使用容器管理事务和非XA数据源(主要是了解@TransactionAttribute注释如何影响事物)。

上面的尝试试图通过隔离自己的方法中的持久性并用REQUIRES_NEW标记它,为每个数据库明确创建一个新事务。这不起作用 - sysout消息表明,在addsaveToEM方法中,都有“无事务”。

为什么不是每次调用saveToEM都创建一个新事务?对我来说,add方法有“无交易”,因为它标记为NOT_SUPPORTED。但是saveToEM上的REQUIRES_NEW不应该在每次调用时创建一个新事务? (GlassFish 4.0,EclipseLink 2.5)

+0

你如何获取/设置em实例?您是否尝试过Glassfish上的JPA示例,例如https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris

+0

每个em实例都有类似'@PersistenceContext(unitName =“jdbc/.. something ..”)的东西EntityManager emdb1;'我应该注意到使用JPA一直工作正常 - 直到我尝试使用超过1数据源。只要我尝试同时使用两者,我会得到一个非XA错误(我​​明白)。所以我试图将persist分离到不同的数据源,以避免使用XA数据源。 – CraftWeaver

+1

我相信因为saveToEM被本地调用,容器不会为该调用启动一个事务。它被视为只是一种Java方法。 – Chris

回答

0

由于saveToEM在本地被调用,因此它被视为只是一个java方法,所以容器不会为该调用启动一个事务。