方法内部调用的事务问题
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) {
}
其他事务问题
稀土掘金:# 8个Spring事务失效的场景