Весенняя транзакция: require_new beharivour

Может быть, я неправильно понимаю поведение Spring Requires_new. Вот мой код:

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRED)
public void outterMethod() throws Exception{
    innerMethod1();
    innerMethod2();         
}
@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRES_NEW)
public void innerMethod1() throws Exception{
    testService.insert(new Testbo("test-2", new Date()));
}

@Transactional(rollbackFor=Exception.class,propagation=Propagation.REQUIRES_NEW)
public void innerMethod2() throws Exception{
    testService.insert(new Testbo("test-2", new Date()));
    throw new Exception();
}

Когда innnerMethod2 выбрасывает исключение, я подумал, что innerMethod1 все еще может совершить фиксацию. Но откат всех внешних и внутренних транзакций. Что я здесь не так? Как я могу зафиксировать innerMethod1 при откате innerMethod2?


person Thien Dinh    schedule 08.04.2014    source источник


Ответы (1)


Хотя вы правильно поняли поведение Propagation.REQUIRES_NEW, вы наткнулись на распространенное заблуждение о транзакционном поведении Spring.

Для применения транзакционной семантики (то есть для того, чтобы аннотация метода имела какой-либо эффект), метод необходимо вызывать извне класса. Вызов метода, аннотированного транзакцией, изнутри класса абсолютно не влияет на транзакционную обработку (поскольку сгенерированный Spring прокси-класс, содержащий транзакционный код, не вступает в игру).

В вашем примере innerMethod2 может быть аннотирован @Transactional, но, поскольку он вызывается из outterMethod, аннотация не обрабатывается.

Ознакомьтесь с этим часть документации Spring

person geoand    schedule 08.04.2014