[spring]spring事务和事务传播机制

embedded/2024/10/17 19:06:44/

文章目录

  • 一. 事务
  • Spring中的事务实现
    • 编程式事务
    • 声明式事务@Transactional
    • @Transactional作用
  • @Transactional详解
    • 1. rollbackFor
    • 2. 事务隔离级别
      • mysql事务隔离级别
      • Spring事务隔离级别
    • 3. 事务传播机制
      • 什么是事务传播机制
      • 事务传播机制有哪些
      • Spring事务传播机制使用
        • REQUIRED(加入事务)
        • REQUIRES_NEW(新建事务)
        • NEVER(不支持当前事务,抛异常)
        • NESTED(嵌套事务)

一. 事务

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

Spring中的事务实现

在这里插入图片描述

编程式事务

在这里插入图片描述
在这里插入图片描述
提交:

@RequestMapping("/user")
@RestController
public class UserController {//JDBC事务管理器@Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;//定义事务属性@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate UserInfoService userInfoService;@RequestMapping("/registry")public String registry(String name, String password){//开启事务TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);//用户注册userInfoService.registryUser(name,password);//提交事务dataSourceTransactionManager.commit(transactionStatus);return "注册成功";}
}

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

回滚:
在这里插入图片描述

在这里插入图片描述
数据库中并没有添加

声明式事务@Transactional

添加依赖:

<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>

在这里插入图片描述

添加注解:

@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate UserInfoService userInfoService;@Transactional@RequestMapping("/registry")public String registry(String name, String password) {userInfoService.registryUser(name, password);return "注册成功";}

在这里插入图片描述
抛出异常:
在这里插入图片描述
在这里插入图片描述
事务回滚, 没有提交, 数据库没有添加数据

@Transactional作用

在这里插入图片描述
在这里插入图片描述
异常被捕获住:
在这里插入图片描述
在这里插入图片描述
会提交

如果想要异常被捕获了, 但是事务依然回滚, 有两种方式:

  1. 重新抛出异常
    在这里插入图片描述
  2. 手动回滚事务
    在这里插入图片描述
    在这里插入图片描述

@Transactional详解

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

1. rollbackFor

@Transactional默认只在遇到运行时异常RuntimeException和Error时才会回滚, 非运行时异常不回滚
在这里插入图片描述
如果我们需要让所有异常都回滚, 需要配置@Transactional注解中的rollbackFor属性, 通过rollbackFor这个属性指定出现何种异常类型时事务进行回滚
在这里插入图片描述
在这里插入图片描述

2. 事务隔离级别

mysql事务隔离级别

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

Spring事务隔离级别

在这里插入图片描述
在这里插入图片描述
Spring事务隔离级别可以通过@Transactional中的isolation属性进行设置
在这里插入图片描述

3. 事务传播机制

什么是事务传播机制

事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的
在这里插入图片描述
事务隔离级别是解决多个书屋同时调用一个数据库的问题
在这里插入图片描述

事务传播机制解决的是一个事务在多个节点(方法)中的传递问题
在这里插入图片描述

事务传播机制有哪些

@Transactinal注解致辞书屋传播是指的设置, 通过propagation属性来指定传播行为
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Spring事务传播机制使用

REQUIRED(加入事务)

在这里插入图片描述

@RestController
@RequestMapping("/propaga")
public class PropagationController {@Autowiredprivate UserInfoService userInfoService;@Autowiredprivate LogInfoService logInfoService;@RequestMapping("/r1")@Transactional(propagation = Propagation.REQUIRED)public String r1(String name, String password){//用户注册userInfoService.registryUser(name, password);//记录操作日志logInfoService.insertLog(name, "用户注册");return "r1";}
}@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;@Transactional(propagation = Propagation.REQUIRED)public void registryUser(String name, String password){userInfoMapper.insert(name, password);}
}@Service
public class LogInfoService {@Autowiredprivate LogInfoMapper logInfoMapper;@Transactional(propagation = Propagation.REQUIRED)public void insertLog(String name, String op){//出现异常int a = 10/0;logInfoMapper.insertLog(name,op);}
}

在这里插入图片描述
只创建了一个事务, 并且事务并没有提交, 数据库中也没有更新数据

流程描述:

  1. r1⽅法开始事务
  2. ⽤⼾注册,插⼊⼀条数据(执⾏成功)(和r1使⽤同⼀个事务)
  3. 记录操作⽇志,插⼊⼀条数据(出现异常,执⾏失败)(和r1使⽤同⼀个事务)
  4. 因为步骤3出现异常,事务回滚.步骤2和3使⽤同⼀个事务,所以步骤2的数据也回滚了
REQUIRES_NEW(新建事务)

将事务传播机制改成Propagation.REQUIRES_NEW
在这里插入图片描述
用户数据插入成功, 日志表数据发生异常, 插入失败
在这里插入图片描述

NEVER(不支持当前事务,抛异常)

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

程序执行报错
在这里插入图片描述

NESTED(嵌套事务)

在这里插入图片描述
在这里插入图片描述
r1事务可以认为是⽗事务,嵌套事务是⼦事务.⽗事务出现异常,⼦事务也会回滚,⼦事务出现异常,如
果不进⾏处理,也会导致⽗事务回滚

在这里插入图片描述

NESTED和REQUIRED的区别
在LogInfoService中进行捕获异常, 并进行当前事务回滚
在这里插入图片描述
在这里插入图片描述
发现 用户表提交成功, 但是日志表提交失败
由于LogInfoService已经捕获了异常, 所以不会导致r1父事务回滚, r1正常提交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/embedded/126406.html

相关文章

conda打包

tar 是一个在 Unix 和类 Unix 系统中常用的命令行工具&#xff0c;用于打包多个文件和目录到一个归档文件&#xff08;通常称为 tarball&#xff09;&#xff0c;以及从这些归档文件中解包文件和目录。 以下是使用 tar 进行打包和解包的基本用法&#xff1a; 打包&#xff08;…

docker overlay 占用空间太大,迁移到 /data/

将 Docker 的 overlay 存储驱动迁移到 /data/ 目录下&#xff0c;可以通过以下步骤完成&#xff1a; 1. 停止 Docker 服务 首先&#xff0c;停止 Docker 服务以确保没有容器在运行&#xff0c;并且数据不会被写入到当前的存储位置。 sudo systemctl stop docker2. 备份现有数…

微信小程序处理交易投诉管理,支持多小程序,一键授权模式

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

中信银行信息技术管理部各岗位社会招聘要求

科技人力资源支持岗 职位描述 1.结合科技人才发展规划,组织人才梯队建设,对人员任用、评价、培养等进行评估并提出建议、解决方案; 2.优化信息科技关键岗位及关键人才的管理体系,包括关键岗位识别、岗位能力梳理、人才盘点及评估等工作; 3.搭建信息科技文化体系,并推动金…

C++ STL容器(五) —— priority_queue 底层剖析

这篇来讲下 priority_queue&#xff0c;其属于 STL 的容器适配器&#xff0c;容器适配器是在已有容器的基础上修改活泼限制某些数据接口以适应更特定的需求&#xff0c;比如 stack 栈使数据满足后进先出&#xff0c;queue 队列使数据满足先进先出&#xff0c;其都是在已有容器上…

Kafka相关知识

Kafka保证消息的可靠投递&#xff1f; Kafka 确保消息可靠投递的机制主要包括以下几点&#xff1a; 消息确认机制&#xff08;ACKs&#xff09;&#xff1a;Kafka 提供了三种级别的消息确认机制&#xff0c;以确保生产者发送的消息能够可靠地被 Broker 接收。 acks0&#xff…

ansible常用的模块

shell: 执行相关命令,支持管道&#xff1a; - name: Execute the command in remote shell; stdout goes to the specified file on the remoteansible.builtin.shell: somescript.sh >> somelog.txtcommand同shell&#xff0c;但是不支持管道 - name: Run command if …

[含文档+PPT+源码等]精品基于asp.net实现的原生Andriod病例管理随访系统[包运行成功+永久免费答疑辅导]

基于ASP.NET实现的原生Android病例管理随访系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、技术背景 ASP.NET技术框架 ASP.NET是由微软开发的一种用于构建动态Web应用程序和服务的开源服务器端Web应用框架。它提供了一套丰富的工具和库&#xff0c;支持多种…