2015-04-16 2 views
0

У меня есть пружинящая инъекция услуги в себя, чтобы позволить службе совершать транзакционные звонки самому себе. К сожалению, я обнаружил, что метод require_new, который бросает исключение NullPointerException и оказывается пойманным, не откатывает новую транзакцию. Внешняя транзакция не прерывается, что я хочу, но у меня возникают проблемы с объяснением, почему требуется, чтобы новая транзакция не откатилась. Есть идеи?Метод Proxied REQUIRES_NEW не откатывается (весна)

@Service(value="orderService") 
@Transactional 
public class OrderServiceImpl implements OrderService { 

    @Resource 
    private OrderService orderService; // transactional reference to this service 

    public void requiredTransMethod(){ 
     try { 
      orderService.requiresNewTransMethod(); 
     }catch(Throwable t){ 
      LOG.error("changes from requiresNewTransMethod call should be rolled back right?", t); 
     } 
    } 

    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void requiresNewTransMethod() { 
     // database changes that are NOT rolled back 
     throw new NullPointerException("bla bla bla"); 
    } 

} 
+0

Я заметил, что изменения базы данных, которые не откатны, не выполняются до тех пор, пока не будет возвращен элемент управления RequireTransMethod(). Это заставляет меня думать, что requireNewTransMethod() использует транзакцию вызывающего абонента. Другие require_new методы, вызываемые в фактической реализации, совершают немедленно после возврата элемента управления требуемомуTransMethod(). Не уверен, какая разница между требуемыми_значениями, которые работают, и теми, которые этого не делают. – user2832649

+0

Даже при условии, что требуемыйTransMethod аннотируется с помощью Propagation.NOT_SUPPORTED, изменения requireNewTransMethod() не выполняются до тех пор, пока не будет возвращен методTransMethod(). – user2832649

ответ

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