使用javax.transaction.UserTransaction在EJB中实现事务

Ser*_*ion 2 jboss transactions ejb-3.0

我正在实现一个EJB应用程序.此时我需要一个交易.我需要在行中执行3个方法,如果一个失败,应该回滚所有内容.在这里:http://www.conceptgo.com/gsejb/eb04.html,我找到了一个教程.我的代码:

    try {
        javax.transaction.UserTransaction ut = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
        ut.begin();
        Feeds feed = loadFeed(url);

        try{
            em.persist(feed);
            uf.setFeedId(feed.getFeedId());
            uf.setUserId(user_id);         
            em.persist(uf);
        }catch (EntityExistsException e){
            ut.rollback();
            return false;
        }catch (IllegalArgumentException ea){
            ut.rollback();
            return false;
        }
        if (feed.getFeedId()!= null && feed!=null) {
            ut.commit();
        }else{
            ut.rollback();
            return false;
        }
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时,我收到下一条错误消息

Caused by: java.lang.IllegalStateException: BaseTransaction.checkTransactionState
 - ARJUNA016051: thread is already associated with a transaction
Run Code Online (Sandbox Code Playgroud)

谁知道原因是什么以及如何解决?

Ray*_*te3 5

该错误意味着您已经有一个正在进行的事务,很可能是一个容器管理的事务.

你的bean /方法是什么样的?JBoss7中无状态会话bean的默认事务行为是它使用Container托管事务和"Required"事务属性执行.

因此,假设容器管理的事务适合您,则不需要UserTransaction.因此,您可以删除查找和begin/commit/rollback,因为这将为您管理.

如果您确实想自己管理事务,那么将bean标记为使用Bean托管事务,然后您可以开始/提交/回滚UserTransaction.要将bean标记为使用bean管理的事务,您需要将注释@TransactionManagement(TransactionManagementType.BEAN)应用于类或方法.