2012-01-09 4 views
0
public class BusinessService { //spring bean 

    public dumpAllData(List){ 

    /* Complicated DB operation here 
    * We dont want to be in transaction now (because of performance issues) 
    */ 

    for(...){   //iterating through whole list 
     **updateItem(item);** 
    } 

    } 

    public updateItem(Entity e){ 
    //saves entity into DB 
    //we want to be in transaction now 
    } 

} 

конфигурацию Spring:Весна + спящий режим, вложенная NOT_SUPPORTED транзакции атрибут

<tx:advice id="txAdvice" transaction-manager="wsTransactionManager"> 
    <tx:attributes>   
     <tx:method name="dumpAllData" propagation="NOT_SUPPORTED" /> 
     <tx:method name="updateItem" propagation="REQUIRES_NEW" /> 
    </tx:attributes> 
</tx:advice> 

можно иметь вложенные распространение REQUIRED_NEW, которое будет вызываться из метода с распространением NOT_SUPPORTED?

Вещь заключается в том, что мы выполняем обширную операцию DB (~ 100Mb) в dumpAllData(), поэтому мы не хотим быть в транзакции (иначе это будет проблема производительности). Но мы хотим быть в транзакции (rollback/commit) в методе updateItem (где мы просто просто обновляем объекты).

ответ

0

Я не вижу, как происходит внутри транзакции или нет. Вы измеряли разницу в производительности, или вы просто догадываетесь?

В любом случае, если вам действительно нужно это сделать, то метод updateItem должен быть в другом весеннем бобах, введенном в фасоль BusinessService.

Действительно, Spring может только начать/совершить транзакцию, когда метод bean вызывается через прокси. Если вы вызываете метод bean из другого метода одного и того же компонента, Spring не может перехватить вызов и выполнить управление транзакциями.

+1

Массовые обновления баз данных, выполненные за одну транзакцию, могут привести к большой нагрузке на базу данных (огромные журналы повтора в случае оракула). Лучше выполнять их в автоматическом режиме или разделить на более мелкие куски. – mrembisz

+0

Autocommit? с гибернатом? Действительно плохая идея, ИМХО. См. Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#batch –

+0

@Mrembisz: «раскол в меньших кусках» - да, это наша идея. Мы хотим совершать небольшие изменения один за другим. У вас есть полезный пример/ссылка? Thx –

0

Аннотации транзакций в методе обновления не будут перехватываться инфраструктурой транзакций Spring, если они вызваны из одного метода того же класса. Чтобы узнать больше о том, как работает Spring, обратитесь к Spring Transaction.

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