Does Spring @Transactional attribute work on a private method?

后端 未结 8 2157
耶瑟儿~
耶瑟儿~ 2020-11-22 14:03

If I have a @Transactional -annotation on a private method in a Spring bean, does the annotation have any effect?

If the @Transactional annotation is on

8条回答
  •  無奈伤痛
    2020-11-22 14:37

    By default the @Transactional attribute works only when calling an annotated method on a reference obtained from applicationContext.

    public class Bean {
      public void doStuff() {
        doTransactionStuff();
      }
      @Transactional
      public void doTransactionStuff() {
    
      }
    }
    

    This will open a transaction:

    Bean bean = (Bean)appContext.getBean("bean");
    bean.doTransactionStuff();
    

    This will not:

    Bean bean = (Bean)appContext.getBean("bean");
    bean.doStuff();
    

    Spring Reference: Using @Transactional

    Note: In proxy mode (which is the default), only 'external' method calls coming in through the proxy will be intercepted. This means that 'self-invocation', i.e. a method within the target object calling some other method of the target object, won't lead to an actual transaction at runtime even if the invoked method is marked with @Transactional!

    Consider the use of AspectJ mode (see below) if you expect self-invocations to be wrapped with transactions as well. In this case, there won't be a proxy in the first place; instead, the target class will be 'weaved' (i.e. its byte code will be modified) in order to turn @Transactional into runtime behavior on any kind of method.

提交回复
热议问题