в одном дао у меня есть 2 @Transactional метода.
если я не обеспечиваю явных свойств,
затем, что произойдет, если
Я выполняю один метод в теле другого?
Оба метода выполнят в ТОМ ЖЕ ТРАНЗАКЦИЮ?
При использовании 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 , включая это «решение»:
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
Значение по умолчанию для атрибута распространения
для @Transactional
- ТРЕБУЕТСЯ
, что означает:
Поддержка текущего транзакция, создайте новую, если ее нет.
Итак, да - оба метода будут работать в одной транзакции.
Но один важный совет: не делайте свой DAO транзакционным . Услуги должны быть транзакционными, а не DAO.
одно замечание:
В режиме прокси (который используется по умолчанию), перехватываются только внешние вызовы методов, поступающие через прокси, перехватываются. Это означает, что самопризыв, в по сути, метод внутри целевого объекта, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения, даже если вызываемый метод помечен @Transactional.