方法转发包含Spring的@Transactional注释的方法?

时间:2011-08-02 16:04:03

标签: java hibernate spring

我有一个服务实现,看起来类似于以下内容:

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 个答案:

答案 0 :(得分:3)

这是典型的情况。 @Transactional具有propagation属性。此属性定义了在调用@Transactional方法时的行为 - 是否需要新事务,是否需要现有事务等。

默认情况下,传播为REQUIRED,这意味着 - 如果不存在,则将启动新事务;否则将使用现有的。

Read here about transaction propagation

这里要提到的另一件事是(在某些配置方案中)如果您正在调用同一类的方法,则不会触发事务拦截器,因此根本不会考虑传播。因此,在您的情况下,很可能忽略第二种方法上的@Transactional

答案 1 :(得分:1)

假设您正在使用JDK代理:

永远不会调用第二个@Transactional。当您对AOP使用JDK代理时,只有在对代理bean进行调用时才会将该建议应用于该方法。当您在同一个类上调用另一个方法时,调用不会传递在创建bean时弹出“包装”方法的代码。如果您需要这样做,您将不得不向ApplicationContext请求它创建的bean代理的引用。

另外,Collections,singletonList