这里主要实验同一个Service 中调用不同的方法出现的失效,比如 Service 中 A() 方法中调用 B() 。
实验如下:
场景1:
@Service
public class TestTransactionService {
@Autowired
private SignTaskRepository signTaskRepository;
@Transactional
public void methodA() {
doSomethingBefore();
this.methodB();
doSomethingAfter();
}
//@Transactional
public void methodB() {
SignTask task = new SignTask();
task.setSalesNo("testNo");
signTaskRepository.save(task);
throw new RuntimeException("testError");
}
}
mothodA()有 @Transactional 注解, mothodB() 没有@Transactional 注解,这时候数据会不会插入到数据库中呢?结果是不会,说明mothodA() 的事务起作用。
因为methodA()开启了一个事务,methodB()加入到这个事务中,异常回滚,这个没什么问题。
场景2:
@Service
public class TestTransactionService {
@Autowired
private SignTaskRepository signTaskRepository;
//@Transactional
public void methodA() {
doSomethingBefore();
this.methodB();
doSomethingAfter();
}
@Transactional
public void methodB() {
SignTask task = new SignTask();
task.setSalesNo("testNo");
signTaskRepository.save(task);
throw new RuntimeException("testError");
}
}
mothodA()有 没有 Transactional 注解, mothodB() 有@Transactional 注解,这时候数据会不会插入到数据库中呢?结果是会,说明mothodB() 的事务不起作用。这是因为 methodA() 中 调用 methodB() 是用 this.methodB() 调用的。
场景3:
@Service
public class TestTransactionService {
@Autowired
private SignTaskRepository signTaskRepository;
//@Transactional
public void methodA() {
doSomethingBefore();
TestTransactionService bean = BaseHolder.getBean(TestTransactionService.class);
bean.methodB();
//this.methodB();
doSomethingAfter();
}
@Transactional
public void methodB() {
SignTask task = new SignTask();
task.setSalesNo("testNo");
signTaskRepository.save(task);
throw new RuntimeException("testError");
}
}
mothodA()有 没有 Transactional 注解, mothodB() 有@Transactional 注解,但是这是调用 methodB() 的方式是BaseHolder.getBean(),内部实际上是使用 spring 的ApplicationContext.getBean()。 这时候数据会不会插入到数据库中呢?
结果是不会,说明 mothodB() 的事务起作用。