• Spring事务笔记


    1:在同一个类中,如果A方法有事务,B方法也有事务(propagation = Propagation.REQUIRES_NEW),如下代码所示:

    @Override
    @Transactional
    public 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和InvocationHandler
    Proxy :负责new对象
    InvocationHandler : 实现增强

    3:注解:@Auword,也是实现代理模式

    也是代理类spring容器启动的时候 所有的类全部扫描,发现加了注解之后,方法为key 注解为value,Map<key,List<Value>>

    不同的注解对应的拦截器是不一样的

    4:为了解决1问题,在springboot项目中,在Application类中添加注解 @EnableAspectJAutoProxy(exposeProxy=true)

    然后在A方法中实现这样的方法:所以方法B能被动态代理了,方法前后则实现方法增强,从而实现事务。

    @Override
    @Transactional
    public 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");
    }














    郭慕荣博客园
  • 相关阅读:
    兄弟连学python——MongoDB相关
    兄弟连学python——redis相关
    python学习——tkinter实战(猜价格)
    python学习——tkinter实战(计算器)
    python学习——while实战小练习
    python学习——循环结构
    python学习——数据类型转换
    python学习——通过while循环语句实现九九乘法表的四种表达方式
    python—Html表单
    python—Redis简介及应用
  • 原文地址:https://www.cnblogs.com/jelly12345/p/11963896.html
Copyright © 2020-2023  润新知