【Spring框架】Spring事务

news2024/9/27 5:45:33

目录

  • Spring中事务的实现
  • 编程式事务
  • 声明式事务
    • @Transactional 作⽤范围
    • @Transactional 参数说明
    • 注意事项
    • @Transactional ⼯作原理
  • MySQL 事务隔离级别
  • Spring 事务隔离级别
  • 事务传播机制

Spring中事务的实现

Spring中事务操作分为两类:
1.编程式事务
2.声明式事务

编程式事务

Spring ⼿动操作事务和上⾯ MySQL 操作事务类似,它也是有 3 个重要操作步骤:
1.开启事务
2.提交事务
3.回滚事务

SpringBoot 内置了两个对象,DataSourceTransactionManager ⽤来获取事务(开启事务)、提交或回滚事务的,⽽ TransactionDefinition 是事务的属性,在获取事务的时候需要将 TransactionDefinition 传递进去从⽽获得⼀个事务 TransactionStatus
@RestController

public class UserController {
 @Resource

 private UserService userService;
 // JDBC 事务管理器

 @Resource

 private DataSourceTransactionManager dataSourceTransactionManager;
 // 定义事务属性

 @Resource

 private TransactionDefinition transactionDefinition;
 @RequestMapping("/sava")
 public Object save(User user) {
 // 开启事务

 TransactionStatus transactionStatus = dataSourceTransactionManager

 .getTransaction(transactionDefinition);
 // 插⼊数据库

 int result = userService.save(user);
 // 提交事务

 dataSourceTransactionManager.commit(transactionStatus);

// // 回滚事务

// dataSourceTransactionManager.rollback(transactionStatus);

 return result;
 }
}

声明式事务

声明式事务的实现很简单,只需要在需要的⽅法上添加 @Transactional 注解就可以实现了,⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动回滚事务

接下⾥使⽤以下代码,分别设置 @Transactional 注解和不设置 @Transactional
在这里插入图片描述

@Transactional 作⽤范围

@Transactional 可以⽤来修饰⽅法或类:
1.修饰⽅法时:需要注意只能应⽤到 public ⽅法上,否则不⽣效。推荐此种⽤法。
2.修饰类时:表明该注解对该类中所有的 public ⽅法都⽣效。

@Transactional 参数说明

在这里插入图片描述

注意事项

@Transactional 在异常被捕获的情况下,不会进⾏事务⾃动回滚.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
程序中发生异常,但被 try-catch处理之后不自动回滚事务的解决方案:
1.将异常继续跑出去(代理对象就能感知到异常,也就能自动的回滚事务)
在这里插入图片描述

在这里插入图片描述
2.使用代码⼿动回滚事务,在⽅法中使⽤ TransactionAspectSupport.currentTransactionStatus() 可以得到当前的事务,然后设置回滚⽅法 setRollbackOnly 就可以实现回滚了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Transactional ⼯作原理

@Transactional 是基于 AOP 实现的,AOP ⼜是使⽤动态代理实现的。如果⽬标对象实现了接⼝,默认情况下会采⽤ JDK 的动态代理,如果⽬标对象没有实现了接⼝,会使⽤ CGLIB 动态代理。
@Transactional 在开始执⾏业务之前,通过代理先开启事务,在执⾏成功之后再提交事务。如果中途遇到的异常,则回滚事务。

MySQL 事务隔离级别

  1. READ UNCOMMITTED:读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,⽽未提交的数据可能会发⽣回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。

  2. READ COMMITTED:读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。

  3. REPEATABLE READ:可重复读,是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致。但也会有新的问题,⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败(因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读 (Phantom Read)。

  4. SERIALIZABLE:序列化,事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。

Spring 事务隔离级别

  1. Isolation.DEFAULT:以连接的数据库的事务隔离级别为主。

  2. Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。

  3. Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。

  4. Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。

  5. Isolation.SERIALIZABLE:串⾏化,可以解决所有并发问题,但性能太低。

事务传播机制

Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些⽅法间进⾏传递的。

事务传播机制:规定多个事务在相互调用时,事务的执行行为。

Spring 事务传播机制包含以下 7 种:

  1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加⼊该事务;如果当前没有事务,则创建⼀个新的事务。
    在这里插入图片描述

  2. Propagation.SUPPORTS:如果当前存在事务,则加⼊该事务;如果当前没有事务,则以⾮事务的⽅式继续运⾏。
    在这里插入图片描述

  3. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加⼊该事务;如果当前没有事务,则抛出异常。

  4. Propagation.REQUIRES_NEW:表示创建⼀个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部⽅法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部⽅法会新开启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰。

  5. Propagation.NOT_SUPPORTED:以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起。

  6. Propagation.NEVER:以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常。

  7. Propagation.NESTED:如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏;如果当前没有事务,则该取值等价PROPAGATION_REQUIRED。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言小知识点

文章目录 int main()与int main(void)符号常量常变量无符号赋值将占字节多的赋值给字节少的类型赋初值 表达式预处理格式符e格式符 循环for 输入长度相关输出文件管理 int main()与int main(void) int main(void) 指的是此函数的参数为空,不能传入参数,…

Streamlit的第一个应用(二)

文章目录 1 前言2 创建第一个应用 📝🚀3 获取数据 📦🔍4 函数缓存🚀🔍📊5 赏析原始数据 ✨🎉6 绘制直方图 📊✨7 所有乘车点的地图 🌍🚖8 完整代码…

Linux修改系统语言

sudo dpkg-reconfigure locales 按pagedown键,移动红色光标到 zh_CN.UTF-8 UTF-8,空格标记*号(没标记下一页没有这一项),回车。 下一页选择 zh_CN.UTF-8。 如果找不到 dpkg-reconfigure whereis dpkg-reconfigure …

手机变电脑2023之虚拟电脑droidvm

手机这么大的内存,装个app来模拟linux,还是没问题的。 app 装好后,手指点几下确定按钮,等几分钟就能把linux桌面环境安装好。 不需要敲指令, 不需要对手机刷机, 不需要特殊权限, 不需要找驱…

第二十二章 原理篇:UP-DETR

最近一直在忙各种各样的面试,顺便重新刷了一遍西瓜书。 感觉自己快八股成精了,但是一到写代码的环节就拉跨,人真是麻了。 许愿搬家前可以拿到offer! 参考教程: https://arxiv.org/pdf/2011.09094.pdf https://zhuanla…

第一百二十二天学习记录:C++提高:STL-vector容器(上)(黑马教学视频)

vector基本概念 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新的空间,而是找更大的内…

荐读 | 《揭秘云计算与大数据》

当我们回顾过去几十年的科技进步时,云计算和大数据在现代科技发展史上无疑具有里程碑式的意义,它们不仅改变了我们的生活方式,而且对各行各业产生了深远的影响。 在这个数字化时代,云计算和大数据技术已经成为推动全球发展的关键…

Java:如何破坏类加载器的双亲委派机制?

本文重点 我们前面分析过loadClass方法,我们可以发现,这个方法的逻辑就是双亲委派机制,也就是说只要不破坏这个方法,那么就不会破坏双亲委派机制。如果要想破坏双亲委派机制,我们需要在类中重写loadClass方法,只要这样,那么就不会走双亲委派机制了。 破坏还是不破坏双…

【GitOps系列】使用 ArgoCD ApplicationSet 来实现多环境管理

文章目录 前言自动多环境管理概述自动化管理多环境实战示例应用简介ApplicationSet 简介部署 ApplicationSet访问多环境 创建新环境实验结语 前言 聊起多环境,通常可能会立即想到下面几个常见的环境: 开发环境测试环境预发布环境生产环境 为了让不同职…

TikTok运营五个要点,这些你都知道吗?

TikTok也就是海外版抖音,和抖音一样同属于字节跳动,其整个发展模式也类似于抖音,但相比抖音现在成熟的商业模式而言,TikTok还处于明显的娱乐阶段,虽然它也在缓慢的测试一些电商。 即使如此,由于抖音的巨大…

group normalization

1、 Theory look for this link for more information, actually only this image can illustrate the group normalization.you can ignore the rest of this artical. 2、 Code check this link for detailed about the formulation and the theory of the group normalzi…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到,简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停…

软考A计划-系统集成项目管理工程师-信息系统安全管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

从excel中提取嵌入式图片的解决方法

1 发现问题 我的excel中有浮动图片和嵌入式图片,但是openpyxl的_image对象只提取到了浮动图片,通过阅读其源码发现,这是因为openpyxl只解析了drawing文件导致的,所以确定需要自己解析 2 解决思路 1、解析出media资源 2、解析…

阿里云“通义千问”开源,可免费商用

我是卢松松,点点上面的头像,欢迎关注我哦! 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天,阿里云公开表态,把自家的通义千问大模型开源。 阿里云把通用70亿参数模型,包括Qwen-7B和对话模…

python 变量赋值 修改之后 原值改变

ython 是一种动态语言,因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时,实际上是将变量的引用地址传递给新的变量,这意 味着新旧变量将指向同一个位置。因此,在更改其中一个变量的值时,另一…

第二十二篇:思路拓展:如何打造高性能的 React 应用?

React 应用也是前端应用,如果之前你知道一些前端项目普适的性能优化手段,比如资源加载过程中的优化、减少重绘与回流、服务端渲染、启用 CDN 等,那么这些手段对于 React 来说也是同样奏效的。 不过对于 React 项目来说,它有一个区…

linux 系统初始化基本yum命令

安装可能用到的系统工具 yum -y install vim telnet wget net-tools lrzsz unzip zip 安装常用工具和开发包 yum install -y which openssh-clients openssh-server less iproute bzip2 cmake gcc gcc-c gdb git libtool make man net-tools sysstat sudo psmisc nc net-t…

kvm+qemu+libvirt管理虚机

virt-manager 图形化创建虚拟机 #virt-manager纳管远程kvm虚拟机 # 可以指定kvm虚机的ssh端口和virt-manager所在主机的私钥 virt-manager -c qemussh://root10.197.115.17:5555/system?keyfileid_rsa --no-fork # 如果你生成的ssh-key 的名称是 test-key,在/home/ssh-key/ 目…

面向城乡公交的嵌入式系统远程升级设计方案

针对城乡公交站牌显示终端现场升级与维护困难的问题,提出了一种基于应用程序(IAP)技术的嵌入式系统远程升级设计方案。 通过IAP技术配合改良过的远程升级程序代替传统的现场烧写调试,节约了奔赴现场调试的时间和成本。 针对远程…