Administrator
发布于 2025-01-10 / 12 阅读
0
0

Spring事务问题汇总(涉及面试部分)

方法内部调用的事务问题

1、如果在一个没有事务的方法内部直接调用 this 下的其他被事务修饰的方法,那么同样无法生效。
因为此时通过内部调用改被事务修饰的方法实际上是通过 this 的方式被调用,没有被spring AOP 代理到该方法。


如果确实想让事务生效的处理方式:


  • 把事务加在最开始的调用方法上,被调用的方法的需为public。
@Transactional
@Override
public void transaction(int id) {//do something
insertLabel(id);

}

public void insertLabel(int id) {
`//do something
}

  • 将要被调用的方法另建一个ServiceB 然后通过注入的方式在需要调用的ServceA 中注入,然后通过 ServiceB.方法() 的方式,避免 this 的调用。
    或者在当前Service 中注入自己的类 例如在ServceA 再通过@Autowired 再次注入 ServceA 然后去引用。
@Override
public void transaction(int id) {
//do something
servceA.insertLabel(id);

}

@Transactional
public void insertLabel(int id) {
`//do something
}

事务的部分回滚

如下:在某个节点insertLabel报错时,因为方法上加上了事务,所以会报错的循环的数据会回滚, 又因为加上try catch,所以哪怕transaction加上事务,也不受影响。 如果想transaction也回滚,只需抛出异常即可。

@Override
public void transaction(int id) {
    //do something
    for (int i = 0; i < id; i++) {
        try {
            transactionService.insertLabel(i);
        } catch (Exception e) {
        }
    }
}

@Transactional
public void insertLabel(int id) {
}

其他事务问题

CSDN:# Spring 事务失效的十二种场景,以及事务传播机制特性 学习总结

稀土掘金:# 8个Spring事务失效的场景

# Spring事务回滚的两种方法


评论