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

Jboss 使用javax.transaction.UserTransaction在EJB中实现事务,jboss,transactions,ejb-3.0,Jboss,Transactions,Ejb 3.0,我正在实现一个EJB应用程序。在这一点上,我需要一个交易。我需要在第行执行3个方法,如果其中一个失败,所有的东西都应该回滚。 这里:,我找到了一个教程。 我的代码: 当我运行我的应用程序时,我会收到下一条错误消息: Caused by: java.lang.IllegalStateException: BaseTransaction.checkTransactionState - ARJUNA016051: thread is already associated with a transac

我正在实现一个EJB应用程序。在这一点上,我需要一个交易。我需要在第行执行3个方法,如果其中一个失败,所有的东西都应该回滚。 这里:,我找到了一个教程。 我的代码:

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

Caused by: java.lang.IllegalStateException: BaseTransaction.checkTransactionState
 - ARJUNA016051: thread is already associated with a transaction

有人知道原因是什么以及如何解决吗?

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

你的bean/方法是什么样子的?JBoss7中无状态会话bean的默认事务行为是,它使用容器管理的事务和“必需”事务属性执行

因此,假设容器管理的事务对您有效,您不需要UserTransaction。因此,您可以删除查找和开始/提交/回滚,因为这将为您管理


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

错误显示您试图中断JBoss中容器管理的事务。若您想以自己的方式处理事务,那个么更改您的类/方法bean

@TransactionManagement(TransactionManagementType.BEAN) 
public void getTransaction(){
    //....
} 

现在您可以安全地从JBoss端访问,但必须确保必须在Bean管理的事务中定义事务的每个步骤。

不建议对CMT使用几个步骤,而对BMT使用几个步骤,因为在这种情况下,CMT容器将负责处理事务和相关线程。所以ejb容器将获得对参与事务的对象的锁定,并且在事务完成之前不会释放这些对象。如果您在BMT中需要这些对象,这些对象可能会导致问题。因此,您必须使用CMT或BMT。

您好。谢谢你的回复。听起来很棒。但是,我觉得我所做的命令彼此没有关联。不明白为什么ejb会执行事务或不相关的东西?首先持久化提要类对象,然后持久化UserFeed类型对象。em.persist(饲料);uf.setFeedId(feed.getFeedId());uf.setUserId(用户id);em.persist(uf);好的,如果您确实需要自己管理事务,那么您需要声明您的bean将管理事务本身,然后使用UserTransactions。我已经更新了我上面的答案。Thanx很多。在这种情况下,是否有任何方法可以管理容器管理的某些方法和用户事务中的某些方法。或者这是否意味着bean中的每个方法都将由userTransaction管理?
@TransactionManagement
具有
@Target(ElementType.TYPE)
,因此您不能用它来注释方法-只有类/接口/…谢谢。然而,有时当我使用persist()这样的简单方法时,如果我使用BMT,它会抛出错误,需要事务。在这种情况下该怎么办?这意味着您正在方法()中使用transaction,但您的操作不在transaction下。只需使用@TransactionAttribute(TransactionAttributeType.Required)public void createDepartment(){}
@TransactionManagement(TransactionManagementType.BEAN) 
public void getTransaction(){
    //....
}