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 (где мы просто просто обновляем объекты).
Массовые обновления баз данных, выполненные за одну транзакцию, могут привести к большой нагрузке на базу данных (огромные журналы повтора в случае оракула). Лучше выполнять их в автоматическом режиме или разделить на более мелкие куски. – mrembisz
Autocommit? с гибернатом? Действительно плохая идея, ИМХО. См. Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#batch –
@Mrembisz: «раскол в меньших кусках» - да, это наша идея. Мы хотим совершать небольшие изменения один за другим. У вас есть полезный пример/ссылка? Thx –