Поддержка Spring Nested Transaction в Bea Weblogic 10.3 - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть к вам вопрос.У меня есть компонент, который имеет 2 метода.Первый метод должен быть присоединен к внешней транзакции, запущенной из другого компонента, присутствующего в цепочке (я использую Spring Integration), а второй должен быть присоединен (для моего приложения) к другой транзакции.Мне нужно поведение, когда второй метод генерирует исключение, первый метод запускается и сам присоединяется к внешней транзакции, чтобы выполнить свою работу.Я пытаюсь использовать распространение «NESTED» Spring Framework для этого, но безуспешно.

Это пример:

public ComponentClassInterface{
         @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor=Exception.class) /*but i have used NESTED without success and I don't want use the same transaction */
         public ObjectMessage activate(ObjectMessage message);

}

public ComponentAbstractClass implements ComponentClassInterface{

       public void updateObjectMessage(ObjectMessage message){
              /*To obtain an attached instance of previously persisted message*/
              ObjectMessage message = daoMessage.getMessageByID(message.getID);/*Here i can't retreive the message...the transaction isn't yet attached*/
              message.setSomeProperty("ChangedPropertyValue");
              daoMessage.updateItem(message);
              }
       @Override
       public abstract ObjectMessage activate(ObjectMessage message);

}

public ComponentConcreteClass extends ComponentAbstractClass{
       @Override
       public ObjectMessage activate(ObjectMessage message){
              ............ doSomeStuff ............
       }

}

Цель состоит в том, чтобы найти решение, которое позволило бы мне не переписывать и не переосмысливать поток приложения и поддерживать классы, как описано.

С уважением,

Дамиано

1 Ответ

1 голос
/ 29 апреля 2011

Транзакции в Spring поддерживаются через AOP и прокси.Это означает, что если метод экземпляра класса вызывает другой метод того же экземпляра, он не вызывает метод через прокси Spring, и Spring не может перехватить вызов и начать новую транзакцию для вас.Вам нужно поместить метод с распространением REQUIRES_NEW в другой компонент Spring.

...