Spring事务及其传播机制(一)

目录

1.事务回顾

1.1什么是事务

1.2事务的四大重要特性(ACID)

1.3事务的操作

2.Spring中事务的实现

2.1编程式事务(了解)

2.2声明式事务@Transactional

3.@Transactional作用

3.1重新抛出异常 

3.2手动回滚事务


1.事务回顾

在数据库阶段我们已经学习过事务了

1.1什么是事务

事务是一组操作的集合,是一个不可分割的操作.
事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求.所以这组操作要么同时成功,要么同时失败.

1.2事务的四大重要特性(ACID)

事务具有以下四个重要特性,通常称为 ACID 特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败回滚。如果事务中的某个操作失败,整个事务会撤销,就好像整个事务从未执行过一样。

  2. 一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性状态。这意味着数据库中的数据必须始终满足预定的规则和约束。

  3. 隔离性(Isolation):多个事务并发执行时,它们之间相互隔离,一个事务的执行不能被其他事务干扰。每个事务都感觉自己在独立地操作数据库。

  4. 持久性(Durability):一旦事务成功提交,其对数据库的更改就会永久保存,即使系统出现故障也不会丢失。

1.3事务的操作

事务的操作主要有三步:
1.开启事务:start transaction/begin(一组操作前开启事务)
2.提交事务:commit(这组操作全部成功,提交事务)
3.回滚事务:rollback (这组操作中间任何一个操作出现异常,回滚事务)

 -- 开启事务
 start transaction; 

 -- 提交事务 
 commit;

 -- 回滚事务
 rollback;

2.Spring中事务的实现

前面课程我们讲了MySQL的事务操作,Spring对事务也进行了实现.
Spring中的事务操作分为两类:编程式事务、声明式事务

2.1编程式事务(了解)

编程式事务为手动写代码操作事务,Spring手动操作事务和上面MySQL操作事务类似,有3个重要操作步骤:

  1. 开启事务(获取事务)
  2. 提交事务
  3. 回滚事务

 SpringBoot内置了两个对象:
1.DataSourceTransactionManager事务管理器.用来获取事务(开启事务),提交或回滚事务
2.TransactionDefinition是事务的属性,在获取事务的时候需要将TransactionDefinition传递进去从而获得一个事务TransactionStatus
我们还是根据代码的实现来学习:

 @RequestMapping("/user") 
 @RestController
 public class UserController { 
     // JDBC 事务管理器
     @Autowired
     private DataSourceTransactionManager dataSourceTransactionManager;
     // 定义事务属性 
     @Autowired
     private TransactionDefinition transactionDefinition;

     @Autowired
     private UserService userService;

     @RequestMapping("/registry")
     public String registry(String name,String password){
        // 开启事务
         TransactionStatus transactionStatus = dataSourceTransactionManager
                .getTransaction(transactionDefinition);
        //⽤户注册
        userService.registryUser(name,password); 
        //提交事务
         dataSourceTransactionManager.commit(transactionStatus); 
        //回滚事务
         //dataSourceTransactionManager.rollback(transactionStatus);
         return "注册成功 ";
     }
 }

观察事务提交:

 //提交事务
 dataSourceTransactionManager.commit(transactionStatus);

运行程序: http://127.0.0.1:8080/user/registry?name=admin&password=admin

观察数据库的结果, 数据插入成功.

观察事务回滚:

 //回滚事务
 dataSourceTransactionManager.rollback(transactionStatus);

运行程序:

观察数据库, 虽然程序返回"注册成功", 但数据库并没有新增数据.

以上代码虽然可以实现事务, 但操作也很繁琐, 有更简单的实现方法:声明式事务

2.2声明式事务@Transactional

声明式事务的实现很简单,只需要在需要事务的方法上添加@Transactional注解就可以实现了。无需手动开启事务和提交事务,进入方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务.
我们来看代码实现:

 @RequestMapping("/trans") 
 @RestController
 public class TransactionalController { 
     @Autowired
     private UserService userService; 

     @Transactional
     @RequestMapping("/registry")
     public String registry(String name,String password){
        //⽤⼾注册
        userService.registryUser(name,password);
         return "注册成功 ";
     }
 }

运行程序,发现数据插入成功.

修改程序, 使之出现异常

 @Slf4j
 @RequestMapping("/trans")
 @RestController
 public class TransactionalController { 
     @Autowired
     private UserService userService; 

     @Transactional
     @RequestMapping("/registry")
     public String registry(String name,String password){
        //⽤⼾注册
        userService.registryUser(name,password);
         log.info("⽤户数据插⼊成功"); 
        //强制程序抛出异常
        int a = 10/0;
         return "注册成功 ";
     }
 }

运行程序:

发现虽然日志显示数据插入成功, 但数据库却没有新增数据, 事务进行了回滚.

我们一般会在业务逻辑层当中来控制事务,因为在业务逻辑层当中,一个业务功能可能会包含多个数据访问的操作,在业务逻辑层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内.上述代码在Controller中书写,只是为了方便学习.

3.@Transactional作用

@Transactional可以用来修饰方法或类:
修饰方法时:只有修饰public方法时才生效(修饰其他方法时不会报错,也不生效)[推荐]
修饰类时:对@Transactional修饰的类中所有的public方法都生效.
方法/类被@Transactional注解修饰时,在目标方法执行开始之前,会自动开启事务,方法执行结束之后,自动提交事务.
如果在方法执行过程中,出现异常,且异常未被捕获,就进行事务回滚操作。如果异常被程序捕获,方法就被认为是成功执行,依然会提交事务。

修改上述代码,对异常进行捕获

 @Transactional
 @RequestMapping("/registry")
 public String registry(String name,String password){ 
     //⽤户注册
     userService.registryUser(name,password);
     log.info("⽤户数据插⼊成功"); 
     //对异常进⾏捕获
     try {
        //强制程序抛出异常
        int a = 10/0;
     }catch (Exception e){
        e.printStackTrace(); 
     }
     return "注册成功 "; 
 }

运行程序, 发现虽然程序出错了, 但是由于异常被捕获, 所以事务依然得到了提交. 如果需要事务进行回滚, 有以下两种方式:

3.1重新抛出异常 

 @Transactional
 @RequestMapping("/registry")
 public String registry(String name,String password){ 
     //⽤户注册
     userService.registryUser(name,password);
     log.info("⽤户数据插⼊成功"); 
     //对异常进⾏捕获
     try {
        //强制程序抛出异常
        int a = 10/0;
     }catch (Exception e){
        //将异常重新抛出去
        throw e; 
     }
     return "注册成功 "; 
 }

重新抛出异常后事务会进行回滚

3.2手动回滚事务

使用TransactionAspectSupport.currentTransactionStatus()得到当前的事务,并设置setRollbackOnly

 @Transactional
 @RequestMapping("/registry")
 public String registry(String name,String password){ 
     //⽤⼾注册
     userService.registryUser(name,password);
     log.info("⽤户数据插⼊成功"); 
     //对异常进⾏捕获
     try {
        //强制程序抛出异常
        int a = 10/0;
     }catch (Exception e){
        // ⼿动回滚事务
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
     }
     return "注册成功 "; 
 }

代码解释: 

TransactionAspectSupport是 Spring 框架中与事务处理相关的一个支持类。 currentTransactionStatus()方法用于获取当前正在执行的事务的状态对象。 setRollbackOnly()方法用于将获取到的当前事务状态设置为只回滚。这意味着无论事务中后续的操作结果如何,整个事务都会被回滚,不会进行提交。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/758106.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32第八课:Su-03t语音识别模块

文章目录 需求一、SU03T语音识别模块二、模块配置流程1.固件烧录2.配置串口和传输引脚3.中断函数4.double类型转换5 数据发送6.接收处理 三、该模块完整代码总结 需求 基于上次完成空气质量传感器,利用SU03T语音识别模块,实现空气质量的语音问答播报。 …

代发考生战报:6月25号 南宁 HCIP-Transmission传输 H31-341考试884分通过

代发考生战报:6月25号 南宁 HCIP-Transmission传输 H31-341考试884分通过 ,今天我和同事两个人去考的,我考试遇到1个新题,他遇到两个新题,客服提供的题库很稳定,全覆盖了,轻松通过,考…

EBS请求通过一段SQL输出EXCEL文件

一.设计初衷 1.EBS请求输出excel文件常用的有3种模式: 1.1.RTF模板XML数据源 1.2 package输出html格式 1.3 package输出excel对应的xml文本 2.上面三种模式开发起来都比较麻烦,而且输出的是xls的文件,如果导出的数据很多,文件特别大。 3.…

Go-知识测试-单元测试

Go-知识测试-单元测试 1. 定义2. 使用3. testing.common 测试基础数据4. testing.TB 接口5. 单元测试的原理5.1 context 单元测试的调度5.1.1 等待并发执行 testContext.waitParallel5.1.2 并发测试结束 testContext.release 5.2 测试执行 tRunner5.3 启动测试 Run5.4 启动并发…

<电力行业> - 《第9课:输电(二)》

4 输送电能流程 输送电能总共有:发电站→升压变压器→高压输电线→降压变压器→用电单位等五个流程。 电力工业初期,发电厂建在电力用户附近,直接向用户送电,所以那个时候只有发电和用电两个环节。 随着电力生产规模和负荷中心规…

基于MongoDB的电影影评分析

项目源码及资料 项目介绍 1、从豆瓣网爬取Top10的电影数据 爬取网址: https://movie.douban.com/top250 1.1 爬取Top10的影视信息 mv_data [] i 0 for x in soup.select(.item):i 1mv_name re.search(>([^<])<, str(x.select(.info > .hd > a > .tit…

ASP.NET Core 6.0 使用 Action过滤器

Action过滤器 在ASP.NET Core中&#xff0c;Action过滤器用于在执行Action方法之前或之后执行逻辑。你可以创建自定义的Action过滤器来实现这一点。 继承 ActionFilterAttribute 类&#xff1a; [TypeFilter(typeof(CustomAllActionResultFilterAttribute))]public IActionRe…

Pc端多功能视频混剪工具/便携版打开即用

PC便携版 视频批量剪辑大师&#xff0c;全自动剪辑神器&#xff0c;会打字就能做视频 多功能&#xff0c;视频混剪&#xff0c;视频配音&#xff0c;文字生成语音&#xff0c;图片合成视频&#xff0c;自动识别音频并生成字幕等功能 链接&#xff1a;https://pan.baidu.com/…

【原创实现 设计模式】Spring+策略+模版+工厂模式去掉if-else,实现开闭原则,优雅扩展

1 定义与优点 1.1 定义 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的⾏为模式。他主要是用于针对同一个抽象行为&#xff0c;在程序运行时根据客户端不同的参数或者上下文&#xff0c;动态的选择不同的具体实现方式&#xff0c;即类的行为可以在运行时更改。…

代码随想录算法训练营第四十七天| 188.买卖股票的最佳时机IV ,309.最佳买卖股票时机含冷冻期 ,714.买卖股票的最佳时机含手续费

188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int k, int[] prices) {int[][] dp new int[prices.length][2*k];for(int i0;i<2*k;i){if(i%2 0){dp[0][i] -prices[0];}else{dp[0][i] 0;} }for(int i1;i…

C语言 | Leetcode C语言题解之第206题反转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* reverseList(struct ListNode* head) {if (head NULL || head->next NULL) {return head;}struct ListNode* newHead reverseList(head->next);head->next->next head;head->next NULL;return newHea…

使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(3)专栏里有上两步的源代码

创建用户登录程序&#xff0c;验证用户账号和密码信息是否在数据库student中的用户表tb_account中存在。用户登录界面如下图所示&#xff1a; 当单击“登录”按钮时&#xff0c;处理以下几种情况&#xff1a; &#xff08;1&#xff09;用户名未输入&#xff0c;提示用户名不能…

Apache Ranger 2.4.0 安装部署

1、安装ranger admin 2、源码编译Ranger wget https://www.apache.org/dist/ranger/2.4.0/apache-ranger-2.4.0.tar.gz tar zxvf apache-ranger-2.4.0.tar.gz cd apache-ranger-2.4.0 mvn -Pall clean mvn clean package -DskipTests maven settting可以设置阿里云进行资源下载…

【漏洞复现】金和OA 未授权访问

【产品介绍】 金和OA协同办公管理系统C6软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#xff0c;充分体现企事业单位规范管理、提高办公效…

fiddler抓包工具

概念 概念&#xff1a; Fiddler是一个http协议调试代理工具&#xff0c;它能够记录并检查所有你的电脑和互联网之间的http通讯。 http&#xff1a;不加密&#xff0c;端口为80 https&#xff1a;加密&#xff0c;端口为443 原理&#xff1a; 其实就在访问服务器时&#xff0…

Python逻辑控制语句 之 判断语句--if语句的基本结构

1.程序执行的三大流程 顺序 分支&#xff08;判断&#xff09; 循环 2.if 语句的介绍 单独的 if 语句,就是 “如果 条件成⽴,做什么事” 3.if 语句的语法 if 判断条件: 判断条件成立&#xff0c;执行的代码…

reactor网络模型的原理与实现

一、rector网络模型 对高并发编程&#xff0c;网络连接上的消息处理&#xff0c;可以分为两个阶段&#xff1a;等待消息准备好、消息处理。当使用默认的阻塞套接字时&#xff0c;往往是把这两个阶段合而为一&#xff0c;这样操作套接字的代码所在的线程就得睡眠来等待消息准备好…

【工具分享】Nuclei

文章目录 NucleiLinux安装方式Kali安装Windows安装 Nuclei Nuclei 是一款注重于可配置性、可扩展性和易用性的基于模板的快速漏洞验证工具。它使用 Go 语言开发&#xff0c;具有强大的可配置性、可扩展性&#xff0c;并且易于使用。Nuclei 的核心是利用模板&#xff08;表示为简…

【文档智能】DLAFormer:端到端的解决版式分析、阅读顺序方法

前言 前面文章介绍到&#xff0c;文档智能中版式分析(DLA)&#xff08;《【文档智能 & RAG】RAG增强之路&#xff1a;增强PDF解析并结构化技术路线方案及思路》&#xff09;、阅读顺序&#xff08;《【文档智能】符合人类阅读顺序的文档模型-LayoutReader及非官方权重开源…

抖音短视频seo矩阵系统源代码开发系统架构及功能解析

一、矩阵运营系统开发背景: 在数字化经营的浪潮中&#xff0c;抖音开放平台以其独特的影响力和广泛覆盖的用户群体&#xff0c;成为了企业不可忽视的数字营销阵地。然而&#xff0c;企业在享受抖音带来的巨大流量红利的同时&#xff0c;也面临着多账号管理运营协同效率低下、数…