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" 没有启动。
希望这可以帮助。
-阿米特
我通过在线资源阅读了所有关于 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" 没有启动。 希望这可以帮助。 -阿米特