spring(七):事务操作
创始人
2025-05-31 01:32:54
0

spring(七):事务操作

  • 前言
  • 一、什么是事务
  • 二、事务四个特性(ACID)
  • 三、事务操作(搭建事务操作环境)
  • 四、事务操作(Spring 事务管理介绍)
  • 五、事务操作(注解声明式事务管理)
  • 六、事务操作(声明式事务管理参数配置)
      • 1、@Transactional
      • 2、propagation:事务传播行为
      • 3、ioslation:事务隔离级别
      • 4、timeout:超时时间
      • 5、readOnly:是否只读
      • 6、rollbackFor:回滚
      • 7、noRollbackFor:不回滚
  • 七、事务操作(XML 声明式事务管理)
  • 八、事务操作(完全注解声明式事务管理)



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!

一、什么是事务

⭕ 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败

⭕ 典型场景:银行转账

  • lucy 转账 100 元 给 mary
  • lucy 少 100,mary 多 100

二、事务四个特性(ACID)

⭕原子性
⭕一致性
⭕隔离性
⭕持久性

三、事务操作(搭建事务操作环境)

在这里插入图片描述

① 创建数据库表,添加记录

② 创建 service,搭建 dao,完成对象创建和注入关系
service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource

@Service
public class UserService {//注入 dao@Autowiredprivate UserDao userDao; }
@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate; }

③ 在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)

@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;//lucy 转账 100 给 mary//少钱@Overridepublic void reduceMoney() {String sql = "update t_account set money=money-? where username=?";jdbcTemplate.update(sql,100,"lucy");}//多钱@Overridepublic void addMoney() {String sql = "update t_account set money=money+? where username=?";jdbcTemplate.update(sql,100,"mary");} }
@Service
public class UserService {//注入 dao@Autowiredprivate UserDao userDao;//转账的方法public void accountMoney() {//lucy 少 100userDao.reduceMoney();//mary 多 100userDao.addMoney();} }

④ 上面代码,如果正常执行没有问题的,但是如果代码执行过程中出现异常,有问题

  public void accountMoney(int money){userDao.reduceMoney(money);int number = 10 / 0;userDao.addMoney(money);}

上面问题如何解决呢?
使用事务进行解决

⑤ 事务操作过程

//转账的方法public void accountMoney() {
//        try {//第一步 开启事务//第二步 进行业务操作//lucy少100userDao.reduceMoney();//模拟异常int i = 10/0;//mary多100userDao.addMoney();//第三步 没有发生异常,提交事务
//        }catch(Exception e) {//第四步 出现异常,事务回滚
//        }}

四、事务操作(Spring 事务管理介绍)

⭕ 事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)

⭕ 在 Spring 进行事务管理操作 有两种方式:
编程式事务管理和声明式事务管理(使用)

⭕ 声明式事务管理
(1)基于注解方式(使用)
(2)基于 xml 配置文件方式

⭕ 在 Spring 进行声明式事务管理,底层使用 AOP 原理

⭕ Spring 事务管理 API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

在这里插入图片描述

五、事务操作(注解声明式事务管理)

1、在 spring 配置文件配置事务管理器

 


2、在 spring 配置文件,开启事务注解
(1)在 spring 配置文件引入名称空间 tx

(2)开启事务注解

 

3、在 service 类上面(或者 service 类里面方法上面)添加事务注解
(1)@Transactional,这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务

@Service
@Transactional
public class UserService {

六、事务操作(声明式事务管理参数配置)

1、@Transactional

在 service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数

在这里插入图片描述

2、propagation:事务传播行为

(1)多事务方法直接进行调用,这个过程中事务 是如何进行管理的

在这里插入图片描述
在这里插入图片描述

@Service
@Transactional(propagation = Propagation.REQUIRED)//默认也是Propagation.REQUIRED
public class UserService {

3、ioslation:事务隔离级别

(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:一个未提交事务读取到另一提交事务修改数据
(5)虚读:一个未提交事务读取到另一提交事务添加数据

在这里插入图片描述

解决:通过设置事务隔离级别,解决读问题

在这里插入图片描述

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
public class UserService {

4、timeout:超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算

5、readOnly:是否只读

(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作 (3)设置readOnly 值是 true,设置成 true 之后,只能查询

6、rollbackFor:回滚

(1)设置出现哪些异常进行事务回滚

7、noRollbackFor:不回滚

(1)设置出现哪些异常不进行事务回滚

@Transactional(readOnly = false,timeout = -1,propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
public class UserService {}

七、事务操作(XML 声明式事务管理)

1、在 spring 配置文件中进行配置
第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面




八、事务操作(完全注解声明式事务管理)

1、创建配置类,使用配置类替代 xml 配置文件

@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {//创建数据库连接池@Beanpublic DruidDataSource getDruidDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql:///user_db");dataSource.setUsername("root");dataSource.setPassword("root");return dataSource;}//创建JdbcTemplate对象@Beanpublic JdbcTemplate getJdbcTemplate(DataSource dataSource) {//到ioc容器中根据类型找到dataSourceJdbcTemplate jdbcTemplate = new JdbcTemplate();//注入dataSourcejdbcTemplate.setDataSource(dataSource);return jdbcTemplate;}//创建事务管理器@Beanpublic DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();transactionManager.setDataSource(dataSource);return transactionManager;}
}

测试:

    public void testAccount() {ApplicationContext context =new AnnotationConfigApplicationContext(TxConfig.class);UserService userService = context.getBean("userService", UserService.class);userService.accountMoney();}

相关内容

热门资讯

【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...
【2023-03-22】SRS... 【2023-03-22】SRS推流搭配FFmpeg实现目标检测 说明: 外侧测试使用SRS播放器测...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
初级算法-哈希表 主要记录算法和数据结构学习笔记,新的一年更上一层楼! 初级算法-哈希表...
进程间通信【Linux】 1. 进程间通信 1.1 什么是进程间通信 在 Linux 系统中,进程间通信...
【Docker】P3 Dock... Docker数据卷、宿主机与挂载数据卷的概念及作用挂载宿主机配置数据卷挂载操作示例一个容器挂载多个目...