EJB事务

EJB Transaction

我通过在线资源阅读了所有关于 EJB 事务的信息,当我应用它时,它并没有像解释的那样工作。

我想做的是

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

 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

并且我正在尝试调用另一个无状态 EJB 中的方法,其事务注释是

 @TransactionAttribute(TransactionAttributeType.REQUIRED).

在上面我认为是在我的 Caller 方法中创建了一个新事务,其注释是

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);
                }

            }
}

IMO,您需要使用 EJB Stub 调用 "ProcessRequests()"(我不确定在较新版本的 EJB 中它叫什么,之前它是 EJB Remote/Local 接口)。因为您从具有 "Not required" 事务属性的方法中调用 "ProcessRequests()" 作为普通方法调用,所以 "Required_new" 没有启动。 希望这可以帮助。 -阿米特