1

我在使用 XA 事务的 Sql Server 2005 上使用 JBoss 6、JPA (Hibernate)。我能够运行查询和存储过程,但我试图在它自己的事务中运行某个存储过程(有点)。这意味着如果存储过程失败或返回错误,则应回滚存储过程所做的更改,而不是其他查询(例如 entityManager.persist())所做的更改

我已经在存储过程本身中尝试了 BEGIN TRANSACTION、ROLLBACK 等,但我得到一个事务不存在的 JDBC 错误。

我怎样才能做到这一点?在自己的事务中运行存储过程?(不知道如何)

谢谢您的帮助

4

1 回答 1

1

回答我自己的问题,这个执行存储过程的方法是 EJB 中的一个子方法,但它不是业务接口的一部分,显然在这种情况下没有创建新事务(即使使用 REQUIRES_NEW),如果我是,请纠正我错误的。

我最终将方法移动到不同的 EJB 并使用注释方法 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)并通过获取 SessionContext

@Resource
protected SessionContext ctx;

ctx.setRollbackOnly();在我需要回滚存储过程的更改而不回滚外部事务更改时执行此操作。

这对我来说很好,但如果我有任何错误,请随时纠正我。

于 2011-09-16T14:42:16.380 回答