我想在一个非常正常的异常上回滚我的事务。但现在我不想回滚我所做的所有动作。 例如,处理对我的应用程序的请求,并完成对多个数据库的多个数据库操作。如果抛出异常,我想回滚我的一个数据库上的所有操作,并且只回滚第二个数据库上的2个操作。我怎样才能做到这一点?我总是最终滚动bback整个交易...
到目前为止我尝试了什么:
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public <Param> GenericResponseMsg executeRequest (Param myParam) {
entityManager1.persist(someEntity); // rollback
...
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void addFailedRequestToDatabase() {
entityManager2.persist(otherEntity); // do not rollback
...
}
我还尝试使用
注释该类@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
但这导致以下异常:
Internal Exception: java.sql.SQLException: Connection can not be used while enlisted in another transaction
Error Code: 0
有什么想法吗?我不知何故卡住了,不知道该怎么做......
修改 以下是您要求的工作流程:
@Stateless
@Path("my/path")
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyRessource {
@EJB
private MyEJB myEjb;
@POST
@Path("method/Path")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public GenericResponseMsg doSomeStuff(Param param) throws Exception {
try {
return myEjb.executeRequest(param);
} catch(Throwable throwable) {
myEjb.addFailedRequestToDatabase();
throw throwable;
}
}
}
答案 0 :(得分:0)
@TransactionAttribute是根据规范支持EJB。 @Transactional支持即将进入第7阶段(目前正在投票@asf)。
附注:对于JTA支持,tomee和openejb独立代码100%相同。