我正在使用XA Transactions在Sql Server 2005上使用JBoss 6,JPA(Hibernate)。 我能够运行查询和存储过程,但我试图在它自己的事务中运行某个存储过程(排序)。 意味着如果存储过程失败或返回错误,应该回滚存储过程所做的更改,而不是其他查询所做的更改,例如entityManager.persist()
我在存储过程本身尝试了BEGIN TRANSACTION,ROLLBACK等...但是我得到了一个JDBC错误,该事务不存在。
我怎样才能做到这一点? 在自己的事务中运行存储过程? (不确定如何)
感谢您的帮助
答案 0 :(得分:1)
回答我自己的问题,这个执行存储过程的方法是EJB中的子方法,但它不是业务接口的一部分,显然在这种情况下不会创建新的事务(即使使用REQUIRES_NEW),如果是我错了。
我最终将方法移动到另一个EJB并使用注释方法
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
并通过
@Resource
protected SessionContext ctx;
当我需要回滚存储过程的更改而不回滚外部事务更改时,并执行ctx.setRollbackOnly();
。
这对我来说很好,但如果我有什么不对的地方,请随时纠正我。