我有一个服务实现,看起来类似于以下内容:
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
注释的方法......
我的问题:
我上面有什么创造任何奇怪的情况?它似乎工作正常,所以我认为外部事务正在被使用,而新的事务没有被创建。它是否正确?另外,有关如何验证/调试此问题的任何提示?
答案 0 :(得分:3)
这是典型的情况。 @Transactional
具有propagation
属性。此属性定义了在调用@Transactional
方法时的行为 - 是否需要新事务,是否需要现有事务等。
默认情况下,传播为REQUIRED
,这意味着 - 如果不存在,则将启动新事务;否则将使用现有的。
Read here about transaction propagation
这里要提到的另一件事是(在某些配置方案中)如果您正在调用同一类的方法,则不会触发事务拦截器,因此根本不会考虑传播。因此,在您的情况下,很可能忽略第二种方法上的@Transactional
。
答案 1 :(得分:1)
假设您正在使用JDK代理:
永远不会调用第二个@Transactional
。当您对AOP使用JDK代理时,只有在对代理bean进行调用时才会将该建议应用于该方法。当您在同一个类上调用另一个方法时,调用不会传递在创建bean时弹出“包装”方法的代码。如果您需要这样做,您将不得不向ApplicationContext请求它创建的bean代理的引用。
另外,Collections,singletonList
!