zoukankan      html  css  js  c++  java
  • 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");
    }














    郭慕荣博客园
  • 相关阅读:
    SQL 存储过程分页
    SqlServer中代理作业实现总结
    firfox兼容性插件
    C#停靠栏组件 DockPanel Suite
    Web.Config加密
    osql
    prototype.js的Ajax对IE8兼容问题解决方案
    获取系统的字体
    基于RBAC的权限管理系统的实现经典
    c/s(C#)下Ftp的多文件上传及其上传进度
  • 原文地址:https://www.cnblogs.com/jelly12345/p/11963896.html
Copyright © 2011-2022 走看看