ejb sessionbean 中的嵌套事务 - bean 管理的事务
Nested transaction in ejb sessionbean - bean managed transaction
我有以下代码保存用户并发送 JMS 消息。目前我用 UserTransaction 包装 saveUserSendMessage
。当嵌套事务时,我在 ejb 中得到一个异常。下面我该怎么做才能使嵌套交易成为可能?
@Resource(mappedName = "java:/JmsXA")
private static QueueConnectionFactory queueConnectionFactory;
@Resource(mappedName = "EjbQueueJndi")
private static Queue queueProp;
@PersistenceContext(unitName = "ejbPersistanceunit")
private EntityManager em;
@Resource
UserTransaction ut;
@Override
public boolean saveUserSendMessage(String name, String email, int age,
boolean arg3) throws Exception {
UserTransaction xact = ut;
xact.begin();
saveUser(name, email, age);
sendMessage("Successfully saved the user");
try {
if (arg3)
throw new Exception("Unsuccessfull");
xact.commit();
} catch (Exception e) {
xact.rollback();
throw e;
}
return true;
}
@Override
public boolean saveUser(String name, String email, int age)
throws Exception {
try {
ut.begin();
UserEntity ue = new UserEntity();
ue.setAge(age);
ue.setEmail(email);
ue.setName(name);
em.persist(ue);
ut.commit();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return true;
}
我得到异常:
15:51:04,127 ERROR [STDERR] javax.transaction.NotSupportedException: BaseTransaction.checkTransactionState - [com.arjuna
.ats.internal.jta.transaction.arjunacore.alreadyassociated] [com.arjuna.ats.internal.jta.transaction.arjunacore.alreadya
ssociated] thread is already associated with a transaction!
Java EE 不支持嵌套事务。它唯一支持的是暂停一个事务,运行一个不相关的事务,以及恢复第一个事务。
为此,您需要调用另一个使用 RequiresNew 事务属性的 EJB。请注意,即使消息接收回滚,内部事务也可以完成,这意味着如果消息引擎崩溃,第二个事务可能会再次 运行。或者,您可以更改 EJB 以使用 bean 管理的事务,这会产生类似的效果。
您确定要这样做吗?最好只在容器管理的事务中执行逻辑。
我有以下代码保存用户并发送 JMS 消息。目前我用 UserTransaction 包装 saveUserSendMessage
。当嵌套事务时,我在 ejb 中得到一个异常。下面我该怎么做才能使嵌套交易成为可能?
@Resource(mappedName = "java:/JmsXA")
private static QueueConnectionFactory queueConnectionFactory;
@Resource(mappedName = "EjbQueueJndi")
private static Queue queueProp;
@PersistenceContext(unitName = "ejbPersistanceunit")
private EntityManager em;
@Resource
UserTransaction ut;
@Override
public boolean saveUserSendMessage(String name, String email, int age,
boolean arg3) throws Exception {
UserTransaction xact = ut;
xact.begin();
saveUser(name, email, age);
sendMessage("Successfully saved the user");
try {
if (arg3)
throw new Exception("Unsuccessfull");
xact.commit();
} catch (Exception e) {
xact.rollback();
throw e;
}
return true;
}
@Override
public boolean saveUser(String name, String email, int age)
throws Exception {
try {
ut.begin();
UserEntity ue = new UserEntity();
ue.setAge(age);
ue.setEmail(email);
ue.setName(name);
em.persist(ue);
ut.commit();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return true;
}
我得到异常:
15:51:04,127 ERROR [STDERR] javax.transaction.NotSupportedException: BaseTransaction.checkTransactionState - [com.arjuna
.ats.internal.jta.transaction.arjunacore.alreadyassociated] [com.arjuna.ats.internal.jta.transaction.arjunacore.alreadya
ssociated] thread is already associated with a transaction!
Java EE 不支持嵌套事务。它唯一支持的是暂停一个事务,运行一个不相关的事务,以及恢复第一个事务。
为此,您需要调用另一个使用 RequiresNew 事务属性的 EJB。请注意,即使消息接收回滚,内部事务也可以完成,这意味着如果消息引擎崩溃,第二个事务可能会再次 运行。或者,您可以更改 EJB 以使用 bean 管理的事务,这会产生类似的效果。
您确定要这样做吗?最好只在容器管理的事务中执行逻辑。