JPA(Hibernate)XA数据源在Transaction中执行存储过程

时间:2011-09-15 17:54:18

标签: hibernate jpa transactions jboss xa

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

我在存储过程本身尝试了BEGIN TRANSACTION,ROLLBACK等...但是我得到了一个JDBC错误,该事务不存在。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

我最终将方法移动到另一个EJB并使用注释方法 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)并通过

获取SessionContext
@Resource
protected SessionContext ctx;
当我需要回滚存储过程的更改而不回滚外部事务更改时,

并执行ctx.setRollbackOnly();

这对我来说很好,但如果我有什么不对的地方,请随时纠正我。