Я хочу отменить мою транзакцию на исключение, которое работает абсолютно нормально. Но теперь я не хочу откатывать все сделанные мной действия. Например, запрос на мое приложение обрабатывается и выполняется несколько действий с базами данных в нескольких базах данных. Если исключение выбрано, я хочу отменить все действия в одной из моих баз данных и всего 2 действия во второй базе данных. Как я могу это сделать? Я всегда в конечном итоге прокатки bback всей сделки ...JTA как не откатывать что-нибудь?
, что я пытался до сих пор:
@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
Любые идеи? Я как-то застрял и не знаю, что делать больше ...
EDIT: Вот рабочий процесс вы просили:
@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;
}
}
}
Тест с REQUIRES_NEW должен работать, если вы вызываете метод правильно. Как этот тест выглядел в более полном потоке? Как и где все методы назывались? – Gimby
Кажется, что это проблема с openejb. Я попробовал свой код непосредственно на моем сервере wildfly и работает так, как ожидалось. Ошибка возникает только при использовании openejb – Goldfish