为了理解Spring事务的工作原理,我想知道在以下情况下会发生什么,其中一个方法被标记为@Transactional
,并调用另一个被标记为@Transactional
的方法。
假设配置使用所有默认设置。
@Service("myService")
@Transactional
public MyService{
public void myServiceMethod(){
myDAO.getSomeDBObjects();
}
}
@Repository("myDAO")
@Transactional
public MyDAOWithUsesBeyondMyService{
public void getSomeDBObjects(){...}
}
假设我输入MyService.myServiceMethod()
,显然它会开启一个事务。那么,当我进入myDAO.getSomeDBObjects()
时会发生什么?因为已经存在一个事务,所以不会创建新的事务吗?还是我在这里创建了两个事务?
关于传播性的文档(下面引用)似乎涵盖了这一点,但我想验证一下我的理解,毕竟对于我这个无知的脑袋来说有点难以理解全部内容。
传播性:通常,在事务范围内执行的所有代码都将在该事务中运行。但是,您可以选择指定当在事务上下文已经存在时执行事务方法的行为。例如,代码可以继续在现有事务中运行(常见情况),或者暂停现有事务并创建一个新事务。Spring提供了EJB CMT熟悉的所有事务传播选项。有关Spring中事务传播语义的详细信息,请参见第10.5.7节“事务传播”。