Spring + hibernate, вложенный атрибут транзакции NOT_SUPPORTED - PullRequest
0 голосов
/ 09 января 2012
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
  }

}

Конфигурация пружины:

<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?

Дело в том, что мы выполняем обширную операцию с БД (~ 100 МБ) в dumpAllData (), поэтому мы не хотим участвовать в транзакции (в противном случае это было бы проблемой производительности). Но мы хотим быть в транзакции (откат / принятие) в методе updateItem (где мы делаем простое обновление сущностей).

Ответы [ 2 ]

0 голосов
/ 08 августа 2017

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

0 голосов
/ 09 января 2012

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

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

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

...