1:在同一个类中,如果A方法有事务,B方法也有事务(propagation = Propagation.REQUIRES_NEW),如下代码所示:
@Override@Transactionalpublic void insertUser(User user, Goods goods){ userMapper.insert(user); try { }catch (Exception e){ }}@Override@Transactional(propagation = Propagation.REQUIRES_NEW)public void insertGoods(Goods goods) throws Exception{ goodsMapper.insert(goods); throw new Exception("sadf");}则B方法是会插入数据的,事务是没有回滚的。2:Spring事务实现机制:Spring事务是使用AOP原理实现的,其实也就是动态代理,动态代理的作用是实现方法增强。动态代理需要两个重要的类:Proxy和InvocationHandlerProxy :负责new对象InvocationHandler : 实现增强3:注解:@Auword,也是实现代理模式
也是代理类spring容器启动的时候 所有的类全部扫描,发现加了注解之后,方法为key 注解为value,Map<key,List<Value>>
不同的注解对应的拦截器是不一样的
4:为了解决1问题,在springboot项目中,在Application类中添加注解 @EnableAspectJAutoProxy(exposeProxy=true)
然后在A方法中实现这样的方法:所以方法B能被动态代理了,方法前后则实现方法增强,从而实现事务。
@Override@Transactionalpublic void insertUser(User user, Goods goods){ userMapper.insert(user); try { IUserService service = (IUserService)AopContext.currentProxy(); service.insertGoods(goods); }catch (Exception e){ }}@Override@Transactional(propagation = Propagation.REQUIRES_NEW)public void insertGoods(Goods goods) throws Exception{ goodsMapper.insert(goods); throw new Exception("sadf");}