springAop实现事务管理控制

2023-10-31

Aop简要概述:

       Aop面向切面编程,可以实现代码的解耦合,提高代码的复用性。

      1:切面:

                   切面的意思通俗的意思就是切入的代码,比如开启事务方法的代码,提交事务的代码

      2:切入点:

                   需要切入代码的地方,比如待执行代码的前,或者后

      3:连接点

                   满足规则的地方,定位到某个类,或者方法

      4:通知

                   通知分为:前置通知,后置通知,环绕通知,异常通知

spring实现事务控制代码:

一:引入依赖(为了方便起见,使用springboot2版本,懒得再去一个一个引入依赖信息)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
</dependencies>

二:配置application.yml文件

server:
  port: 8080 #服务器端口号
spring:
  jpa:
    database: mysql #使用 jpa 
    show-sql: true 
  datasource:
    driver-class-name: com.mysql.jdbc.Driver  数据库驱动
    username: root 用户名
    password: 1234  密码
    url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&amp;characterEncoding=UTF8 数据库地址

三:创建启动类

package com.zbin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类
 *
 * @author zhangbin 2019年03月22日
 * @version 1.0
 * @since 1.0 2019年03月22日
 */
@SpringBootApplication
public class AopApplication {
    public static void main(String[] args) {
        SpringApplication.run(AopApplication.class,args);
    }
}

至此,该项目可以正常启动了

四:创建工具类,用于开启事务,提交事务,会滚事务

package com.zbin.aop;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
//注入spring容器中
@Component
//创建为多例对象,放置多线程安全问题
@Scope("prototype")
public class AopAspectUtil {
    @Autowired
    private DataSourceTransactionManager manager; //注入spring的事务管理器
   //事务拦截器
    private TransactionStatus transaction;

    /**
     * @return org.springframework.transaction.TransactionStatus
     * @Author zhangbin
     * @Description 开启事务
     * @Date 9:54 2019/3/25
     * @Param []
     **/
    public TransactionStatus begin() {
        transaction = manager.getTransaction(new DefaultTransactionAttribute());//设置为默认事务隔离级别
       //返回事务拦截器
        return transaction;
    }

    /**
     * @return void
     * @Author zhangbin
     * @Description 提交事务
     * @Date 9:54 2019/3/25
     * @Param []
     **/
    public void commit() {
       // 提交事务
        manager.commit(transaction);
    }

    /**
     * @return void
     * @Author zhangbin
     * @Description 会滚事务
     * @Date 9:54 2019/3/25
     * @Param []
     **/
    public void rollback() {
       //回滚事务
        manager.rollback(transaction);
    }
}

五:定义注解

package com.zbin.aop.mytransation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE,ElementType.METHOD})//设置注解使用范围
@Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
public @interface MyTransactional {
}

六:自定义通知

使用注意,在针对事务管理方面,方法中不要去try{}catch(){},使用try,,catch后aop不能获取到异常信息,会导致出现异常后不能进行回滚,如果确实需要try,,,catch 可以再finally中加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();由此段代码进行事务的回滚

package com.zbin.aop.transaction;

import com.zbin.aop.mytransation.TransactionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

@Component
@Aspect
public class AopTransaction {
    @Autowired
    private TransactionUtils transactionUtils;

    @Around("execution(* com.zbin.aop.service.UserService.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //调用方法之前执行
        System.out.println("开启事务");
       transactionUtils.begin();
        proceedingJoinPoint.proceed();
        //调用方法之后执行
        System.out.println("提交事务");
        transactionUtils.commit();

    }

    @AfterThrowing("execution(* com.zbin.aop.service.UserService.add(..))")
    public void afterThrowing() {
        System.out.println("异常通知  ");
        //获取当前事务进行回滚
        //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        transactionUtils.rollBack();
    }
}

七:测试效果 ,,自行测试

@MyTransactional
public void add() {
    userDao.add("test001", 20);
    int i = 1 / 0;
    System.out.println("---------------------");
    userDao.add("test002", 20);
}

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springAop实现事务管理控制 的相关文章

  • TOMCAT开放远程调试端口

    设置远程调试配置 方法一 windows系统 在catalina bat里 SET CATALINA OPTS server Xdebug Xnoagent Djava compiler NONE Xrunjdwp transport dt
  • 2019年第十届蓝桥杯省赛A组(C/C++组)迷宫(BFS)

    试题 D 迷宫 问题描述 下图给出了一个迷宫的平面图 其中标记为 1 的为障碍 标记为 0 的为可 以通行的地方 010000 000100 001001 110000 迷宫的入口为左上角 出口为右下角 在迷宫中 只能从一个位置走到这 个它
  • Could not load dynamic library ‘cublas64_10.dll‘; dlerror: cublas64_10.dll not found或者缺少DLL问题

    项目场景 tensorflow对GPU的支持 尤其是对英伟达GPU的支持 不只是下个tensorflow gpu就完事了 还需要一系列显卡相关的软件的版本匹配 比如最常见的就是那个cuda的版本匹配问题 当然匹配后也不可避免的有很多奇怪的问
  • SpringBoot多线程事务回滚

    1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 Transa
  • Task07 Transformer 解决文本分类任务、超参搜索

    文章目录 1 微调预训练模型进行文本分类 1 1 加载数据 小小总结 1 2 数据预处理 1 3 微调预训练模型 1 4 超参数搜索 总结 1 微调预训练模型进行文本分类 GLUE榜单包含了9个句子级别的分类任务 分别是 1 鉴别一个句子是
  • 【网络】记一次重启网卡之后网络故障原因排查

    一 事件背景 远程通过ssh连接服务器后 执行命令 nmcli con modify ens33 ipv4 dns 8 8 8 8 为ens33网卡添加dns 然后执行命令 nmcli c up ens33 命令重新激活网卡 此时远程网络连
  • 推荐系统遇上深度学习(十一)--神经协同过滤NCF原理及实战

    原创 文文 小小挖掘机 2018 06 02 笔者是一个痴迷于挖掘数据中的价值的学习人 希望在平日的工作学习中 挖掘数据的价值 找寻数据的秘密 笔者认为 数据的价值不仅仅只体现在企业中 个人也可以体会到数据的魅力 用技术力量探索行为密码 让
  • 【Python】 将数据写入 csv 文件中并读取

    将数据存放到csv文件中 默认newline参数的值为 n 在writerow输出一行换行后 还会再次换行 就会导致两条数据之间存在空行的问题 将newline设置为空就可以解决这个文件 import csv 加载csv库 csvfile
  • rhel7 初始化mysql 5.7 root密码

    mysql 5 6版本后已经不提供默认root密码登录了 如果想在5 6版本之后修改mysql root用户密码可参考如下步骤 5 7 11 版本官方下载地址 http dev mysql com downloads mysql 解压后rp
  • 2023前端面试题合集(附答案)持续更新中...

    2023前端面试合集 js基础类 1 什么是原型链及原型链存在的意义 2 什么是作用域 3 什么是闭包 4 浏览器的渲染过程 5 数据类型简介 6 深浅拷贝 7 css水平居中的几种方法 8 你知道数组有哪些实用高阶函数吗 9 call a
  • python使用pywinauto实现桌面APP自动化测试

    准备 1 安装python 安装版本为2 7 14 并将python添加至系统变量 2 安装pywinauto 进入python安装目录 进入Scripts目录下 shift 右键 点击在此处打开命令窗口 输入命令 pip install
  • ai图像识别python的项目_利用ImageAI库只需几行python代码实现目标检测

    什么是目标检测 目标检测关注图像中特定的物体目标 需要同时解决解决定位 localization 识别 Recognition 相比分类 检测给出的是对图片前景和背景的理解 我们需要从背景中分离出感兴趣的目标 并确定这一目标的描述 类别和位
  • JavaScript 浏览器点击复制功能(CopyToClipboard)

    尝试了JS下两种复制到剪贴板的功能 div div
  • mysql的备份和恢复

    mysql的备份和恢复 备份数据库文件 1 停止mysql服务 备份数据库目录中指定数据库 如 cp r var lib mysql bw home backup 2 恢复数据库 将备份文件拷回至数据库目录 var lib mysql 并且
  • 程序员应知应会之——结构体字节对齐 填充与打包

    文章目录 Hello World 数据对齐 结构体的数据填充 输出分析 structure A structure B structure C 结构体也有对齐要求 structure D 如何减少填充 什么是结构体packing 指针 Mi
  • 国际版阿里云/腾讯云免卡开户:阿里云GPU服务器教程

    阿里云GPU服务器教程 阿里云GPU服务器为深度学习和大规模数据处理提供了高效的核算渠道 本文将介绍怎么注册和运用阿里云GPU服务器 1 注册GPU服务器 首先 登录阿里云官网并进入控制台 挑选 ECS 服务 在ECS页面 点击 实例 选项
  • elasticsearch批量修改,批量更新某个字段

    1 源生API 在这里没有用官方提供的bulk API 而是用的另外一种方式 POST infomations infomations update by query JSON请求格式 query match status UP SHELF
  • Android项目实战系列—基于博学谷(七)课程模块(上)

    由于这个模块内容较多 分为上 中 下 三篇博客分别来讲述 请耐心阅读 课程模块分为四个部分 课程列表 课程详情 视频播放 播放记录 课程模块 上 主要讲述课程列表部分 一 水平滑动广告栏界面 1 创建水平滑动广告栏界面 在res layou
  • 友情链接检查工具

    友链检测工具 它是一款 完全免费 的软件 用以检测友情链接没有掉链 与网页版对比 具有 多线程检测 实时检测 速度快 高效 操作 步骤 输入网址 点击查询按钮 等待完成返回查询结果 友链检测工具 zip
  • python简单的学习方式04

    python学习 一 嵌套循坏 二 break和continue关键字 三 for else和while else 四 列表的性质 五 列表的增删查改 1 增加 2 修改 3 删除 一 嵌套循坏 引入模块 作用 直接借用别人实现好的功能来解

随机推荐

  • 实例化和初始化的区别

    实例化一般是由类创建的对象 在构造一个实例的时候需要在内存中开辟空间 即 Student s new Student 初始化 实例化的基础上 并且对 对象中的值进行赋一下初始值
  • 面试题--Git与设计模式

    面试题 Git与设计模式 Git 1 Git和SVN有什么区别 2 什么是Git 3 在 Git 中提交的命令是什么 4 什么是 Git 中的 裸存储库 5 Git 是用什么语言编写的 6 在Git中 你如何还原已经 push 并公开的提交
  • WSL启动Ubuntu时报错“参考的对象类型不支持尝试的操作”

    最近要用到微软的WSL了 打开以后发现hyper v之前因为用virtual box虚拟机给关了 导致报错 打开相关的虚拟化功能以后 又遇到了新的问题 参考的对象类型不支持尝试的操作 电脑系统 WIN11 我会给大家介绍三种方法 打游戏的朋
  • 队列的使用注意点

    队列通常使用链表或数组作为元素的基础存储 队列的大小需要约束 如果允许内存中的队列不受限制 那么对于许多类别的问题 它可以不受限制地增长 直到它达到灾难性失败的地步 因为它耗尽了内存 这发生在生产者超过消费者的时候 无界队列在系统中可能很有
  • leecode26题删除排序数组中的重复项

    双指针法的介绍 下面内容转载自代码随想录 点击进入代码随想录 双指针法 快慢指针法 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作 定义快慢指针 快指针 寻找新数组的元素 新数组就是不含有目标元素的数组 慢指针 指向更新
  • 华为OD机试 - 计算误码率(Java)

    题目描述 误码率是最常用的数据通信传输质量指标 它可以理解为 在多少位数据中出现一位差错 移动通信网络中的误码率主要是指比特误码率 其计算公式如下 比特误码率 错误比特数 传输总比特数 为了简单 我们使用字符串来标识通信的信息 一个字符错误
  • 解决libtorch安装编译链接时出错

    cmake build config Release Scanning dependencies of target example app 50 Building CXX object CMakeFiles example app dir
  • SQL注入漏洞(postgresql注入)

    以前孤陋寡闻对postgresql这个数据库少有了解 后来与几个目前在企业实习的朋友聊天才得知他们有的公司项目用的是postgresql 有的公司是正在将原本的数据库迁移到postgresql 可见postgresql比较热 毕竟免费且功能
  • idea:idea自定义注释模板自动生成方法注释

    idea的类注释 可以通过自己添加模板的方式来生成 在Live Templates里 添加一个分组MyGroup 下面添加一组数据 如下图 Abbreviation为 Expand with选择tab 我个人喜换用tab 主要是跟系统的回车
  • uni-app使用scroll-view实现锚点定位和滚动监听功能

    1 html代码
  • ubuntu实现有线连接拨号上网(本文使用版本ubuntu18.04 )

    1 第一步 cd usr share applications 找到下面的应用 上图中的 NetworkConnections 双击打开 如果没有的话 命令运行 sudo apt install net tools 之后就有了 2 选择以太
  • maven本地仓库jar注册

    mvn install install file Dfile name 包名称 jar DgroupId groupId DartifactId artifactId Dversion version Dpackaging jar 例
  • 《网络建设与运维》大赛试题解析

    网络建设与运维 大赛试题解析资源 CSDN文库 https download csdn net download weixin 41687096 87799021
  • Spring 中AspectJ框架简介说明

    转自 Spring 中AspectJ框架简介说明 在以前的章节中 我们学习了使用代理类实现AOP Spring 2 0 以后 Spring 新增了对 AspectJ 的支持 所以笔者建议大家在Spring 框架中 尽量使用AspectJ方式
  • 2.4总线操作和定时

    文章目录 一 引子 二 介绍 1 总线周期 2 总线定时规范 三 同步定时方式 1 过程 2 特点 3 优缺点 优点 缺点 四 异步定时方式 1 介绍 2 三种方式 1 不互锁方式 2 半互锁方式 3 全互锁方式 3 优缺点 优点 缺点 五
  • 《操作系统》 实验1_unix——io参考

    任务1 在当前用户目录下创建数据文件student txt 文件的内部信息存储格式为Sname S Sdept Sage Ssex 即 姓名 学号 学院 年龄 性别 每行一条记录 输入不少于10条学生记录 其中包括学生本人记录 编写程序ta
  • vscode 输入 npm install 报错: node-sass@8.0.0 install: `node scripts/install.js`

    1 报错信息描述 报错的原因及解决方案 自身入的坑 第一种 看一下这里是否有中文目录 有的话有可能会报错 第二种 管理员身份运行vscode 第三种 node sass版本问题 解决版本问题方案 1 报错信息描述 当我们在vscode中输入
  • 【计算机视觉

    文章目录 一 Co Scale Conv attentional Image Transformer CoaT 二 Pyramid Vision Transformer v2 PVTv2 三 Class Attention in Image
  • android studio编程时出现的错误:Cannot get property 'XXXX' on extra properties extension as it does not exist

    用Android Studio中导入第三方库工程的时候出现的问题 Error 28 0 Cannot get property junitVersion on extra properties extension as it does no
  • springAop实现事务管理控制

    Aop简要概述 Aop面向切面编程 可以实现代码的解耦合 提高代码的复用性 1 切面 切面的意思通俗的意思就是切入的代码 比如开启事务方法的代码 提交事务的代码 2 切入点 需要切入代码的地方 比如待执行代码的前 或者后 3 连接点 满足规