прокси весной 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...
}
}