EJB事务

时间:2016-05-24 13:38:02

标签: java-ee transactions ejb

我通过在线资源阅读了有关EJB交易的所有内容,当我应用它时,它没有按照解释的方式工作。

我想做的是

我有一个无状态EJB方法,其事务注释是

 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

我尝试在另一个无状态EJB中调用一个方法,其Transaction注释为

 @TransactionAttribute(TransactionAttributeType.REQUIRED).

上面我想到的是在我的Caller方法中创建了一个新的Transaction,其注释是

TransactionAttributeType.REQUIRES_NEW 

当我调用其注释为

的第二个方法时
  TransactionAttributeType.REQUIRED 

上一个事务继续进行,但在我的情况下,在第二个方法中创建了一个新事务。

有人可以帮我解决这里发生的事情,提前谢谢。

我在下面发布了我的代码。

  

EOutboundHandler.java

@Stateless
@EJB(name = "EOutboundHandler")
public class EOutboundHandler {

@EJB
    private EData eData;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void Process() {
        while (ProcessRequests()) {
        }
    }
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    private boolean ProcessRequests() {
 EQueue eQueue = eData.searchEQ();
}
}
  

EData.java

     @Stateless
        @EJB(name="EData")
        @TransactionAttribute(TransactionAttributeType.REQUIRED)
        public class EData {
            @PersistenceContext(unitName=EDataConstants.PERSISTANCE_UNIT_NAME)
            private EntityManager em;
        public EdiTxnQ searchEdiTxnQForSendMsg()
            {

                String searchSql = 
                        "SELECT * FROM dbo.EQueue with (updlock, readpast) Where id = 1";

                Query searchQuery = em.createNativeQuery(searchSql, EdiTxnQ.class);
                List<EdiTxnQ> list = searchQuery.getResultList();

                if (list.isEmpty())
                {
                    return null;
                }
                else
                {
                    return (EdiTxnQ)list.get(0);
                }

            }
}

1 个答案:

答案 0 :(得分:1)

IMO,您需要使用EJB Stub调用“ProcessRequests()”(我不确定在较新版本的EJB中调用它是什么,之前它是EJB远程/本地接口)。因为您正在从具有“不需要”事务属性的方法中调用“ProcessRequests()”作为常规方法调用,所以“Required_new”不会被踢入。 希望这可以帮助。 -Amit