2011-08-02 42 views
0

我有一个服务实现这看起来有点像下面这样:包含Spring的@Transactional注解的方法转发方法?

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标注的方法...

我的问题
是上面我所创建的任何奇怪的情况?它似乎工作正常,所以我认为正在使用外部事务,并且没有创建新事务。它是否正确?另外,关于如何验证/调试的提示?

回答

3

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

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

Read here about transaction propagation

另一件事要在这里提到的是,(在某些配置方案)的情况下,您呼叫的同一类的方法,事务拦截器没有被触发,所以传播没有考虑到的。所以在你的情况下,第二种方法中的@Transactional很可能被忽略。

1

假设你正在使用JDK代理:

第二@Transactional甚至不会被调用。当您为AOP使用JDK代理时,只有在针对代理bean进行调用时,才会将建议应用于该方法。当你调用同一类的另一种方法,呼叫没有通过代码传递春天“包装”您当创建bean的方法。如果你需要这样做,你将不得不要求ApplicationContext引用它创建的bean代理。

另外,Collections,singletonList

+0

啊,singletonList岩石!谢谢,我对Java领域还是有点新鲜感。 – Polaris878

相关问题