JTA怎么不回滚什么?

时间:2015-11-18 08:34:17

标签: java java-ee jpa jta

我想在一个非常正常的异常上回滚我的事务。但现在我不想回滚我所做的所有动作。 例如,处理对我的应用程序的请求,并完成对多个数据库的多个数据库操作。如果抛出异常,我想回滚我的一个数据库上的所有操作,并且只回滚第二个数据库上的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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

@TransactionAttribute是根据规范支持EJB。 @Transactional支持即将进入第7阶段(目前正在投票@asf)。

附注:对于JTA支持,tomee和openejb独立代码100%相同。