Spring事务笔记

自古美人都是妖i 提交于 2019-12-06 05:25:52

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");}

 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!