Spring @Transactional метод - участвующая транзакция

в одном дао у меня есть 2 @Transactional метода.

если я не обеспечиваю явных свойств,

затем, что произойдет, если

Я выполняю один метод в теле другого?

Оба метода выполнят в ТОМ ЖЕ ТРАНЗАКЦИЮ?

5
задан Sean Patrick Floyd 6 September 2011 в 09:15
поделиться

3 ответа

Прокси в Spring AOP

При использовании Transactional вы имеете дело с прокси классов, поэтому в этом сценарии:

@Transactional
public void doSomeThing(){ // calling this method targets a proxy

    doSomeThingElse(); // this method targets the actual class, not the PROXY,
                       // so the transactional annotation has no effect
}

@Transactional
public void doSomeThingElse(){
}

вы вызываете прокси извне, но второй метод вызов выполняется из проксируемого объекта и поэтому не имеет поддержки транзакций. Поэтому, естественно, они выполняются в одной транзакции, независимо от того, какие значения аннотации @Transactional во втором методе равны

, поэтому, если вам нужны отдельные транзакции, вы должны вызвать

yourservice.doSomething();
yourservice.doSomethingElse();

извне.

Весь сценарий довольно хорошо объяснен в главе Spring AOP> Понимание прокси AOP , включая это «решение»:

Доступ к текущему объекту прокси AOP изнутри

public class SimplePojo implements Pojo {

   public void foo() {
      // this works, but... gah!
      ((Pojo) AopContext.currentProxy()).bar();
   }

   public void bar() {
      // some logic...
   }
}
12
ответ дан 18 December 2019 в 07:28
поделиться

Значение по умолчанию для атрибута распространения для @Transactional - ТРЕБУЕТСЯ , что означает:

Поддержка текущего транзакция, создайте новую, если ее нет.

Итак, да - оба метода будут работать в одной транзакции.

Но один важный совет: не делайте свой DAO транзакционным . Услуги должны быть транзакционными, а не DAO.

5
ответ дан 18 December 2019 в 07:28
поделиться

Spring doc

одно замечание:

В режиме прокси (который используется по умолчанию), перехватываются только внешние вызовы методов, поступающие через прокси, перехватываются. Это означает, что самопризыв, в по сути, метод внутри целевого объекта, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызываемый метод помечен @Transactional.

4
ответ дан 18 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: