当前位置: 首页 > news >正文

Spring 事务

文章目录

  • 1. 分析
  • 2. 编码
    • 2.1 确认切面
    • 2.2 编写通知
    • 2.3 组装切面
  • 3. SpringBoot事务控制

1. 分析

Spring 是通过aop的方式进行开发的,如果你对aop不太了解,可以看 :http://t.csdn.cn/4QfPi

aop编程分为三步 :确认连接点、编写通知、组装切面

1、连接点 :在需要加事务的方法/类上加上 @Transactional注解。

2、通知 :实现 MethodIntercepter 接口 ,事务操作不就是在开始操作之前开启事务,完成之后提交事务,出现异常回滚事务吗?,开启、提交、回滚这些操作又需要用到 Connection,所以我们需要先注入 Connection。

public class MyAdvice implements MethodInterceptor {
    @Autowired
    private Connection connection;
    @Override
    public Object invoke(MethodInvocation var1) throws Throwable {
        Object object = null;
        try {
            connection.setAutoCommit(false);
            object = var1.proceed();
            connection.commit();
        } catch(Exception e) {
            connection.rollback();
        }
        return object;
    }
}

但是我们想到的,Spring 也能想到,所以 Spring给我们提供了一个类 :DataSourceTransactionManager

在开发中,我们不需要自己写通知类了,只需要编写配置文件(😒还不如让我写代码),Spring就可以帮我们完成事务操作。

DataSourceTransactionManager 这个类使用的也是 conncetion 进行事务操作,但是connection连接对象直接从连接池中取,所以使用它的前提是配置了连接池DataSource。(我们使用Mybatis肯定会配置这个,所以一般不单独配置)

3、切面 :组装切面使用<tx:annotition-driven transaction-manager=“”>标签完成。这里并没有配置切入点 + 通知,因为是注解操作,所以使用的标签是annotation-driven,Spring会自动扫描加了@Transactional 注解的类/方法。

2. 编码

2.1 确认切面

在类/方法上加上 @Transactional 注解

@Transactional
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;
    public void add() {
		userMapper.addUser();
    }
    public void delete() {
		userMapper.deleteUser();
    }
    public void update() {
        userMapper.updateUser();
    }
}

2.2 编写通知

刚才已经说了,Spring 的事务由DataSourceTransactionManager完成,它又需要连接池获取连接对象,所以要进行依赖注入,将连接池注入,以便Spring使用。

Spring为我们写了通知,我们只需要将连接池注入即可。

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3309/test?useSSL=false"/>
    <property name="username" value="root"/>
    <property name="password" value="1234"/>
</bean>

<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>

2.3 组装切面

<tx:annotition-driven transaction-manager="transactionManager"></tx:annotition-driven>

这个标签还有一个属性 :proxy-target-class,值为true/false。

aop的本质是动态代理,事务也是,这个属性就是指定Spring通过哪种方式帮我们创建动态代理对象。

true :Cglib动态代理

false:JDK动态代理

3. SpringBoot事务控制

在SpringBoot中,事务控制变得更为简单,只需要加两个注解,无需其他配置:

  1. 在启动类上加上 @EnableTransactionManagement 注解
@SpringBootApplication
// 1.在启动类上加:
@EnableTransactionManagement
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}
  1. 在需要开启事务的地方加上 @Transactional 注解
// 加在类上时,默认所有方法使用事务。
@Transactional
public class xxx {
    public void add() {

    }
}

相关文章:

  • 海滩的海鸥
  • 医疗系统业务流程
  • 云计算-虚拟化
  • Vue学习之--------插槽【默认插槽、具名插槽、作用域插槽】(2022/8/30)
  • 医疗项目 01(项目简介)
  • 用npm 用jest测试
  • 版税激励错配下,创作者如何可持续地盈利?
  • 蓝桥杯实战应用【算法代码篇】-一题三解:计算二进制中1的个数(附Java和C++代码)
  • 一览「数字身份」市场结构:我们将在元宇宙中成为谁?
  • Web3 时代 市场营销的变迁
  • 常用类和内部类总结
  • 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)
  • 每日简报 8月31日简报新鲜事 每天一分钟 了解新鲜事
  • 【Elasticsearch教程12】Mapping字段类型之object
  • MATLAB算法实战应用案例精讲-【采样路径规划算法】PRM算法(附MATLAB、C++和Python等源码)
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [译]Python中的类属性与实例属性的区别
  • 2017年终总结、随想
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Apache Pulsar 2.1 重磅发布
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ES学习笔记(12)--Symbol
  • HTTP请求重发
  • JAVA多线程机制解析-volatilesynchronized
  • LeetCode18.四数之和 JavaScript
  • Python利用正则抓取网页内容保存到本地
  • scrapy学习之路4(itemloder的使用)
  • spring-boot List转Page
  • vue--为什么data属性必须是一个函数
  • Yeoman_Bower_Grunt
  • 笨办法学C 练习34:动态数组
  • 分享几个不错的工具
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 计算机常识 - 收藏集 - 掘金
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前嗅ForeSpider教程:创建模板
  • 一个SAP顾问在美国的这些年
  • 异常机制详解
  • NLPIR智能语义技术让大数据挖掘更简单
  • 阿里云服务器如何修改远程端口?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #100天计划# 2013年9月29日
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六)c52学习之旅-独立按键
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .java 9 找不到符号_java找不到符号
  • .NET Core中Emit的使用
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NetCore项目nginx发布
  • .NET建议使用的大小写命名原则