我通过在线资源阅读了有关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);
}
}
}
答案 0 :(得分:1)
IMO,您需要使用EJB Stub调用“ProcessRequests()”(我不确定在较新版本的EJB中调用它是什么,之前它是EJB远程/本地接口)。因为您正在从具有“不需要”事务属性的方法中调用“ProcessRequests()”作为常规方法调用,所以“Required_new”不会被踢入。 希望这可以帮助。 -Amit