簡體   English   中英

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管理的事務,這會產生類似的效果。

你確定你真的想這么做嗎? 最好只在容器管理的事務中執行邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM