我正在阅读有关Spring Framework中的声明式事务管理的信息,我试图弄脏我的手。以下是两种情况:
案例1:从控制器调用方法testTransaction,类型级别不存在@Transaction批注。
@Override
@Transactional
public void testTransaction() {
saveFoo2();
saveFoo();
}
private void saveFoo2() {
fooRepository.save(new Foo(null, "asd"));
}
private void saveFoo() {
fooRepository.save(new Foo(null, "zxzxczxxc"));
throw new RuntimeException("Rollback please");
}
情况2:从控制器调用方法testTransaction,类型级别不存在任何@Transaction注释。
@Override
@Transactional
public void testTransaction() {
saveFoo2();
saveFoo();
}
@Transactional
public void saveFoo2() {
fooRepository.save(new Foo(null,"asdasd"));
}
@Transactional
public void saveFoo() {
fooRepository.save(new Foo(null,"zxczaxc"));
throw new RuntimeException("Rollback please");
}
根据我的理解,
在情况1中:每当调用testTransaction方法时,都会创建事务并将同一个事务传播到saveFoo2()和saveFoo()方法,并且同一个事务中的任何runtimeexception都会回滚。
在情况2中:春季事务处理代理服务器,并且只要发生来自同一bean的内部调用,那么该事务就不能回滚。 Reference但在这种情况下,从同一实例调用saveFoo2()和saveFoo(),但事务也正在回滚。我不清楚。
我的理解正确吗?您能指出我所缺少的吗?我做了很多研究,但无法弄清楚。这将是很大的帮助。