方法a调用方法b,两个方法都使用事务,易出错的问题
@Autowired
private OrderService orderService;
@Transactional
public void methodA() {
try{
orderService.methodB();
} catch (Exception e) {
e.printStackTrace();
}
}
@Service
public class OrderService {
@Transactional
public void methodB() {
throw new RuntimeException();
}
}
报错
原因
两个方法共用一个事务,事务b抛出异常,事务被标记为只能回滚状态,方法a没办法提交事务了
解决方法
方法b开启新事务,或者不用事务
public void methodB() {
throw new RuntimeException();
}
或者
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
throw new RuntimeException();
}
或者
@Transactional(propagation = Propagation.NESTED)
public void methodB() {
throw new RuntimeException();
}