Переадресация методов на методы, которые содержат аннотацию Spring @Transactional? - PullRequest
0 голосов
/ 02 августа 2011

У меня есть реализация сервиса, которая выглядит примерно так:

class FooImpl implements Foo {

   @Override
   @Transactional(...)
   public void doSomething(String baz) {
       return this.doSomething(Arrays.asList(new String[] { baz }));
   }


   @Override
   @Transactional(...)
   public void doSomething(List<String> bazList) {
        // do something crazy
        return null;
   }

}

Я хочу понять, что здесь происходит? Я вызываю метод с аннотацией @Transactional из другого метода с аннотацией @Transactional (переадресация метода) ...

Мой вопрос :
Что я имею выше, создавая какие-то странные ситуации? Кажется, он работает правильно, поэтому я думаю, что внешняя транзакция используется, а новая не создается. Это правильно? Кроме того, какие-либо советы о том, как я могу проверить / отладить это?

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Это типичная ситуация. @Transactional имеет свойство propagation. Это свойство определяет поведение в случае, когда вызывается метод @Transactional - нужна ли новая транзакция, нужна ли существующая транзакция и т. Д.

По умолчанию распространение - REQUIRED, что означает - новая транзакция будет запущена, если ее не существует; в противном случае будет использоваться существующий.

Читайте здесь о распространении транзакции .

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

1 голос
/ 02 августа 2011

Если вы используете прокси JDK:

Второй @Transactional никогда даже не будет вызван. Когда вы используете прокси-серверы JDK для AOP, рекомендация применяется к методу только тогда, когда выполняется вызов прокси-компонента. Когда вы вызываете другой метод в том же классе, вызов не проходит через код, который «оборачивает» ваш метод при создании компонента. Если вам нужно, чтобы это произошло, вам следует запросить у ApplicationContext ссылку на созданный им прокси-компонент бина.

В сторону Collections,singletonList!

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