【Spring 篇】基于注解的Spring事务控制详解

在这里插入图片描述

嗨,亲爱的读者朋友们!欢迎来到这篇关于基于注解的Spring事务控制的博客。如果你曾为事务处理而头痛,那么这里将为你揭开事务的神秘面纱。我们将一步步深入探讨Spring事务的世界,用简单易懂的语言、充满情感色彩的文字,带你领略事务的奇妙之旅。

前言:什么是事务?

在我们踏入事务控制的舞台之前,让我们先来了解一下什么是事务。简而言之,事务是一系列操作,要么全部成功执行,要么全部失败回滚。这就好比你在玩电子游戏,要么通关,要么回到起点重新来过。在软件开发中,事务确保了数据的完整性和一致性,是我们保持代码健壮性的重要手段。

Spring事务管理初探

Spring框架为我们提供了一套强大而灵活的事务管理机制。而其中基于注解的事务控制,则是一种让我们事务处理变得轻松愉快的方式。不再需要繁琐的事务管理代码,一切都可以通过简单的注解来搞定。

让我们来看一个简单的例子,假设我们有一个银行服务类:

@Service
public class BankService {@Autowiredprivate AccountRepository accountRepository;@Transactionalpublic void transferMoney(String fromAccount, String toAccount, double amount) {// 从fromAccount扣除金额Account from = accountRepository.findByAccountNumber(fromAccount);from.setBalance(from.getBalance() - amount);accountRepository.save(from);// 向toAccount添加金额Account to = accountRepository.findByAccountNumber(toAccount);to.setBalance(to.getBalance() + amount);accountRepository.save(to);}
}

在这个例子中,通过在 transferMoney 方法上加上 @Transactional 注解,我们告诉Spring,这是一个事务性的方法。如果在方法执行期间发生异常,整个方法的操作将被回滚,保持数据的一致性。是不是感觉事务处理变得异常简单?

事务的传播行为:如何舞动事务的芭蕾

咱们来聊聊事务的传播行为。简而言之,传播行为定义了事务方法之间的关系。举个例子,假设我们有两个服务方法 A 和 B,A 调用了 B,那么事务传播行为就是规定了A和B之间的事务关系。

在Spring中,有几种常见的传播行为,比如 REQUIREDREQUIRES_NEWNESTED。让我们用一个小故事来解释这些概念。

小故事:Alice和Bob的银行冒险

有一天,Alice和Bob决定一同前往银行冒险。他们分别代表了两个服务方法 A 和 B,银行冒险就是一个大事务。让我们看看不同传播行为下的故事发展。

1. REQUIRED - 要共舞一场

Alice(方法A)和Bob(方法B)一起进入银行,决定共同完成这次冒险。如果Alice和Bob中任何一个遇到了困难(异常),整个冒险就失败,两人重新回到银行门口。这就是 REQUIRED 传播行为,他们共舞一场,遇到异常就一同失败。

@Transactional(propagation = Propagation.REQUIRED)
public void adventureWithBank() {aliceService.doSomething(); // AlicebobService.doSomethingElse(); // Bob
}
2. REQUIRES_NEW - 各自为政

Alice和Bob决定各自为政,独立进行银行冒险。无论其中一人失败,另一人都可以继续。这就是 REQUIRES_NEW 传播行为,各自为政,不受对方的事务影响。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void aliceAdventures() {aliceService.doSomething(); // Alice
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void bobAdventures() {bobService.doSomethingElse(); // Bob
}
3. NESTED - 嵌套情感

Alice和Bob选择进行嵌套冒险,就像一个人在另一个人的故事里。如果Bob的冒险失败,他可以独立回到银行门口;但如果Alice的冒险失败,整个故事将重新开始。这就是 NESTED 传播行为,嵌套在对方的事务中。

@Transactional(propagation = Propagation.NESTED)
public void aliceAdventures() {aliceService.doSomething(); // Alice
}@Transactional(propagation = Propagation.NESTED)
public void bobAdventures() {bobService.doSomethingElse(); // Bob
}

这些故事或许显得幼稚,但通过这种方式,你可以轻松理解不同传播行为的含义。

隔离级别:在不同舞台上的表演

事务的隔离级别是事务管理中另一个关键概念。隔离级别定义了多个事务之间的可见性和影响关系。Spring支持的隔离级别有 DEFAULTREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE

我们来看一个简单的例子,通过不同的隔离级别来理解事务的表演。

小故事:隔离级别的舞台

在这个故事中,我们有两位演员,Alice和Bob,代表两个事务。银行就是事务的舞台,而不同的隔离级别就是这场表演的不同舞台设置。

1. READ_UNCOMMITTED - 公开彩排

Alice和Bob在银行里进行公开彩排,他们可以随意看到对方的动作,即使对方的动作还没有提交。这就是 READ_UNCOMMITTED 隔离级别,即一个事务可以看到另一个事务未提交的数据。

@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void alicePerformance() {aliceService.doSomething(); // Alice
}@Transactional(isolation = Isolation.READ_UNCOMMITTED)
public void bobPerformance() {bobService.doSomethingElse(); // Bob
}
2. READ_COMMITTED - 隐蔽彩排

Alice和Bob进行了隐蔽的彩排,只有当对方的动作被提交后,才能看到。这就是 READ_COMMITTED 隔离级别,即一个事务只能看到另一个事务已经提交的数据。

@Transactional(isolation = Isolation.READ_COMMITTED)
public void alicePerformance() {aliceService.doSomething(); // Alice
}@Transactional(isolation = Isolation.READ_COMMITTED)
public void bobPerformance() {bobService.doSomethingElse(); // Bob
}
3. SERIALIZABLE - 隔离彩排

Alice和Bob决定进行严格的隔离彩排,即一个事务完全看不到另一个事务的表演。这就是 SERIALIZABLE 隔离级别,即一个事务执行时,其他事务无法对相同的数据进行更新。

@Transactional(isolation = Isolation.SERIALIZABLE)
public void alicePerformance() {aliceService.doSomething(); // Alice
}@Transactional(isolation = Isolation.SERIALIZABLE)
public void bobPerformance() {bobService.doSomethingElse(); // Bob
}

通过这个小故事,相信你对隔离级别有了更加生动的理解。

超时设置:等待表演的结束

有时候,我们可能希望限制事务的执行时间,以防止某个事务长时间占用资源。@Transactional 注解允许我们设置事务的超时时间,单位是秒。这就像是告诉演员们,你们的表演时间有限,不能一直霸占舞台。

@Transactional(timeout = 60)
public void alicePerformance() {aliceService.doSomething(); // Alice
}

在这个例子中,我们将 timeout 设置为60秒,表示这个事务的表演时间不得超过60秒。如果时间到了,不管表演是否结束,都要结束这场表演。

回滚控制:遇到意外,退场重演

在事务处理中,异常是一个无法避免的问题。Spring框架提供了 @Rollback 注解,用于控制事务是否回滚。默认情况下,Spring事务将在遇到运行时异常时回滚,但我们也可以通过 @Rollback 注解来手动控制回滚。

@Transactional
@Rollback(false)
public void alicePerformance() {aliceService.doSomething(); // Alice
}

在这个例子中,通过 @Rollback(false) 明确告诉Spring,即使在方法中抛出异常,也不要回滚事务。这种情况可能在我们需要记录异常情况但仍然希望保留部分已执行操作时有用。

读写操作的组合:舞台上的交响乐

在数据库事务中,读写操作的组合也是需要考虑的因素。Spring提供了 @Transactional 注解的 readOnly 属性,用于指定事务是否只读。

@Transactional(readOnly = true)
public List<Account> getAllAccounts() {return accountRepository.findAll();
}

在上述例子中,我们标注了 @Transactional(readOnly = true),表示这个事务只包含读操作,不包含写操作。这有助于提高数据库的性能,因为只读事务通常可以避免获得数据库写锁。

结语:跟着音乐的节奏,轻松驾驭事务的舞台

通过这篇博客,我们深入浅出地探讨了基于注解的Spring事务控制。从事务的概念开始,逐步介绍了 @Transactional 注解、事务的传播行为、隔离级别、超时设置、回滚控制、以及一些常见的使用场景。通过生动的小故事和实际的代码示例,相信你对Spring事务管理有了更加深刻的理解。

在这个舞台上,你不再是被事务搞得头痛的观众,而是优雅地跟着音乐的节奏,轻松驾驭着事务的舞台。希望这篇博客对于初学者来说是一次愉快的学习之旅,让你能够在事务的世界里游刃有余。如果你有任何疑问或者想要分享自己的经验,不妨在评论区留下你的足迹。让我们一起共同探索事务控制的奥秘,愉快地编写出高质量的、可靠的代码。感谢你的阅读,希望你在事务的舞台上能够畅快淋漓地表演!🎭💃

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

paddleocr的基本使用

paddleocr是paddlepaddle专门做ocr的库&#xff0c;我们简单用一下 参考 PaddleOCR—图片文字识别提取—快速使用教程_paddleocr使用教程-CSDN博客 目录 1 安装 1.1 前言 1.2 安装paddleocr 1.3 安装paddlepaddle 1.4 安装cuda 1.5 安装cudnn 1.6 配置 zlibwap…

C/C++--ProtoBuf使用

一.什么是ProtoBuf 1.序列化和反序列化概念 序列化&#xff1a;把对象转变为字节序列的过程&#xff0c;称为系列化。 反序列化&#xff1a;把字节序列的内容恢复为对象的过程&#xff0c;称为反序列化。 2.什么情况下需要序列化和反序列化 存储数据&#xff1a;将内存中的对象…

Jmeter接口自动化02--JMeter的安装和使用

p02 高清B站视频链接 2.1 Windows环境 首先需要安装JDK&#xff0c;然后再部署JMeter。注意&#xff0c;JMeter对JDK的版本是有要求的&#xff0c;一般至少要JDK8&#xff0c;这也是目前开发过程中使用频繁的版本。 1. 安装JDK 从官网下载JDK&#xff1a;https://www.oracl…

Transformer详解【学习笔记】

文章目录 1、Transformer绪论2、Encoders和Decoder2.1 Encoders2.1.1 输入部分2.1.2 多头注意力机制2.1.3 残差2.1.4 LayNorm&#xff08;Layer Normalization&#xff09;2.1.5 前馈神经网路 2.2 Decoder2.2.1 多头注意力机制2.2.2 交互层 1、Transformer绪论 Transformer在做…

Hive数据定义(1)

hive数据定义是hive的基础知识&#xff0c;所包含的知识点有&#xff1a;数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、表的修改、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍&#xff1a;数据仓库的创建、数据仓…

2024年【电工(初级)】最新解析及电工(初级)模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;最新解析根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

【数据链路层】802.11无线局域网的基本概述(湖科大慕课自学笔记)

802.11无线局域网基本概述 1&#xff1a;无线局域网&#xff08;WLAN&#xff09; 1&#xff1a;基本概述 2&#xff1a;802.11无线局域网可以分为以下两类 有固定基础设施的与无固定基础设施的 固定基础设施是指 我们来举例说明&#xff1a; 2&#xff1a;有固定基础设施…

python如何安装numpy

1. 根据python版本下载相应版本的numpy保存至D:\Program Files (x86)\Python\Python37\Scripts\ numpy下载地址 2. winR&#xff0c;输入cmd&#xff0c;打开命令行窗口&#xff0c;定位到python的安装目录 3. 输入python -m pip install numpy或定位到目录&#xff1a;D:\P…

02. 坦克大战项目-准备工作和绘制坦克

02. 坦克大战项目-准备工作和绘制坦克 01. 准备工作 1. 首先我们要创建四个类 1. Tank类 介绍&#xff1a;Tank 类主要用来表示坦克的基本属性和行为 public class Tank {private int x;//坦克的横坐标private int y;//坦克的纵坐标public int getX() {return x;}public v…

Pandas十大练习题,掌握常用方法

文章目录 Pandas分析练习题1. 获取并了解数据2. 数据过滤与排序3. 数据分组4. Apply函数5. 合并数据6. 数据统计7. 数据可视化8. 创建数据框9. 时间序列10. 删除数据 代码均在Jupter Notebook上完成 Pandas分析练习题 数据集可从此获取&#xff1a; 链接: https://pan.baidu.co…

基于Linux的Flappy bird游戏开发

项目介绍 主要是使用C语言实现&#xff0c;开启C项目之旅。 复习巩固C语言、培养做项目的思维。 功能&#xff1a; 按下空格键小鸟上升&#xff0c;不按下落&#xff1b; 显示小鸟需要穿过的管道&#xff1b; 小鸟自动向右飞行&#xff1b;&#xff08;管道自动左移和创建&a…

数字图像处理常用算法的原理和代码实现详解

本专栏详细地分析了常用图像处理算法的数学原理、实现步骤。配有matlab或C实现代码&#xff0c;并对代码进行了详细的注释。最后&#xff0c;对算法的效果进行了测试。相信通过这个专栏&#xff0c;你可以对这些算法的原理及实现有深入的理解&#xff01;   如有疑问&#xf…