如果我有以下代码:
@Component
public class A{
@Transactional(propagation = Propagation.REQUIRED)
public void a(){
//logic
b();
//logic
}
@Transactional(propagation = Propagation.REQUIRED)
public void b(){
//logic
}
}
在此代码示例中打开Spring的事务数是多少?
答案 0 :(得分:3)
没关系。从b()
致电a()
时,它无法通过代理,因此b()
上的任何交易属性都不会被考虑。
如果通过代理(即在课堂外)调用a()
或b()
并且尚未处理正在进行的事务,示例代码将打开1个事务。
答案 1 :(得分:3)
我添加到@pablo回答通知,在你的例子中你看不到实际的差异,因为你在同一个对象中调用你的方法,使第二个方法上的@transaction行为透明而没有效果:
在代理模式(默认设置)下,只有外部方法调用 通过代理进入是截获的。这意味着 自调用,实际上是目标对象调用中的一个方法 目标对象的另一种方法,不会导致实际的 即使调用的方法被标记,运行时的事务也是如此 @Transactional
答案 2 :(得分:1)
参考documentation Propagation.REQUIRED
支持当前事务,如果不存在则创建一个新事务。你的问题的答案是:
1个事务,如果在调用A#a()时没有事务。
0-如果已有,则为零,因为它将被重用。