Spring @Transactional метод - участвующая транзакция - PullRequest
5 голосов
/ 19 мая 2010

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

если я не предоставлю никаких явных свойств,

тогда что будет, если

Я запускаю один метод в теле другого?

Оба метода будут выполняться в ОДНОЙ ОДНОЙ СДЕЛКЕ?

Ответы [ 3 ]

12 голосов
/ 19 мая 2010

прокси весной 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...
   }
}
5 голосов
/ 19 мая 2010

Значением по умолчанию атрибута propagation @Transactional является REQUIRED, что означает:

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

Так что да - оба метода будут выполняться в одной транзакции.

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

4 голосов
/ 19 мая 2010

Spring doc

одна нота:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...