@Transactional注解测试

@Transactional注解测试

情况1

@Transactional
public void A() {
    B();
}

public void B() {
	// 具体的业务操作,如插入
	// 如果此处有RuntimeException将会回滚
}

说明:A方法上有@Transactional注解,B方法上没有@Transactional注解。此时Controller调用A方法,若B方法中有运行时异常就会回滚。A方法和B方法用的是同一个事务。

情况2

@Transactional
public void A() {
    B();
}

@Transactional
public void B() {
	// 具体的业务操作,如插入
	// 如果此处有RuntimeException将会回滚
}

说明:A方法上有@Transactional注解,B方法上有@Transactional注解,B会默认加入A中的事务。同情况1,A方法和B方法用的是同一个事务。

情况3

public void A() {
    B();
}

@Transactional
public void B() {
	// 具体的业务操作,如插入
	// 如果此处有RuntimeException不会回滚!!!!!
}

说明:A方法上没有@Transactional注解,B方法上有@Transactional注解,此种情况下当Controller调用A方法,不会开启事务,所以B方法有运行时异常不会回滚。
如果想要B方法上的注解生效,需要用如下方法实现:

@Autowired
private TestService testService;

public void A() {
    testService.B(); // 或者用工具类SpringUtils.getBean(TestService.class).B();
}

@Transactional
public void B() {
	// 具体的业务操作,如插入
	// 如果此处有RuntimeException将会回滚
}

注意此时B方法中有运行时异常就会回滚,但是A方法本身没有开启事务,A中如果有异常,不会回滚。

posted @ 2022-01-21 14:52  Yorkey  阅读(230)  评论(0)    收藏  举报