2015-11-18 1 views
0

Я хочу отменить мою транзакцию на исключение, которое работает абсолютно нормально. Но теперь я не хочу откатывать все сделанные мной действия. Например, запрос на мое приложение обрабатывается и выполняется несколько действий с базами данных в нескольких базах данных. Если исключение выбрано, я хочу отменить все действия в одной из моих баз данных и всего 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; 
     } 
    } 
} 
+1

Тест с REQUIRES_NEW должен работать, если вы вызываете метод правильно. Как этот тест выглядел в более полном потоке? Как и где все методы назывались? – Gimby

+0

Кажется, что это проблема с openejb. Я попробовал свой код непосредственно на моем сервере wildfly и работает так, как ожидалось. Ошибка возникает только при использовании openejb – Goldfish

ответ

0

@TransactionAttribute поддержка EJB в соответствии со спецификацией , Поддержка @Transactional приходит в tomee 7 (в настоящее время под голосованием @asf).

Сторона примечания: автономный код tomee и openejb на 100% одинаковый для поддержки JTA.

Смежные вопросы