Spring事务简介,事务角色,事务属性

1.Spring事务简介

ss

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败
  • Spring事务作用:在数据层或业务层保障一系列的数据操作同成功同失败
public interface PlatformTransactionManager{void commit(TransactionStatus status) throws TransactionException;void rollback(TransactionSattus status) throws TransactionException;
}
public class DataSourceTransactionManager{...
}

案例:银行账户转账

需求:

实现任意两个账户间转账操作

需求微缩:

A账户减钱,B账户加钱

分析:

数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)
业务层提供转账操作(transfer),调用减钱和加钱的操作
提供2个账号和操作金额执行转账操作
基于Spring整合MyBatis环境搭建上述操作

结果分析:

程序正常执行时,账号金额A减B加,没有问题
程序出现异常,转账失败,单是异常之前操作成功,异常之后操作失败,整体业务失败

2.事务角色

添加事务管理操作流程
在业务层接口上添加Spring事务管理

public interface AccountService{@Transactionalpublic void transfer(String out,String in,Double money);
}

注意:Spring注解式事务通常添加在业务层接口中而不会添加到业务层实习类中,降低耦合度

​ 注解式业务可以添加到业务方法上表示开启事务,也可以添加到接口上表示当前接口所有方法开启事务

设置事务管理

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSoure){DataSouceTransactionManager ptm = new DataSourceTransactionManager();ptm.setDataSource(dataSource);return ptm;
}

注意:事务管理要根据实现技术进行选择MyBatis框架使用JDBC事务

开启注解事务驱动

@Configuration
@ComponentScan("com.hcx")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig{
}

Spring事务角色(通过相同数据源来管理)

事务角色
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
事务协调员:加入事务方,在Spring中通常带着数据层方法,也可以是业务层方法
事务相关配置

注意:IOException不属于运行时异常,事务回滚不管理

事务传播行为

事务传播行为:事务协调员对事务管理员所携带事务的处理态度
Spring中七种事务传播行为

事务传播行为类型说明

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS	支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY	使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW	新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED	以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER	以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED	如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

案例:转账业务追加日志
需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

需求微缩:A账户减钱,B账户加钱,数据库记录日志

分析:

基于转账操作案例添加日志模块,实现数据库中记录日志
业务层转账操作(transfer),调用减钱,加钱与记录日志功能
实现效果预期:

无论转账是否成功,均进行转账操作的日志留痕

存在问题:

日志的记录与转账操作隶属于同一事务,同成功同失败

失效效果预取改进:

无论转账操作是否成功,日志必须保留

步骤

在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务)

@Service
public class LogServiceImpl implements LogService{@Autowiredprivate LogDao logDao;@Transactional(propagation = Propagation.REQUIRES_NEW)public void log(String out,String in,Double money){logDao.log("转账操作由"+out+"到"+in+",金额:"+money)}
}

3.事务属性

在Spring框架中,事务属性(Transaction Attributes)是指在定义和管理事务时所使用的一组属性或配置,用于指定事务的行为和特性。Spring提供了一种声明式事务管理的方式,通过在方法或类级别上使用注解或XML配置来定义事务属性。

Spring框架中的事务属性包括以下几个方面:

  1. 传播行为(Propagation Behavior):指定事务方法被嵌套调用时,事务如何传播到嵌套调用的方法中。例如,是否创建新的事务,是否加入现有的事务,等等。

  2. 隔离级别(Isolation Level):指定事务方法在访问数据时所采用的隔离级别,用于控制事务之间的数据可见性。例如,读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)等。

  3. 回滚规则(Rollback Rules):指定在哪些异常情况下事务应该回滚。可以配置一组异常类型,当方法抛出这些异常时,事务将会回滚。

  4. 超时时间(Timeout):指定事务的超时时间,即事务执行的最大时长。如果在指定的时间内事务没有完成,则会自动回滚。

  5. 只读(Read-Only):指定事务是否为只读事务。只读事务可以优化数据库访问,但是不能用于写操作。

  6. 回滚标志(Rollback Only):指定是否将事务标记为只读。如果将事务标记为只读,则事务将被标记为仅回滚,而不是回滚到保存点。

通过合理配置这些事务属性,可以对事务进行精细化的控制和管理,从而确保系统在并发操作下的数据完整性和一致性。

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

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

相关文章

plasmo开发浏览器插件动态setIcon修改插件图标和setBadgeText显示徽标

动态修改图标和设置徽标主要用到action这个api,官网地址:https://developer.chrome.com/docs/extensions/reference/api/action?hlzh-cn#method-setIcon 如果你使用官方原生的方式开发,加载和修改图标应该是比较简单的,但是如果…

C语言面试题之合并排序的数组

合并排序的数组 实例要求 1、给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B; 2、编写一个方法,将 B 合并入 A 并排序; 3、初始化 A 和 B 的元素数量分别为 m 和 n; 示例: 输入: A [1,2,3,0…

小剧场短剧剧集收费短剧小程序APP

1. 内容展现 付费、免费、任务解锁:用户可以通过付费直接观看短剧,也可以通过完成平台任务(如签到、分享等)获得免费观看的机会。这种灵活的解锁方式既满足了用户的多种需求,也促进了平台的活跃度。主流展现形式&…

蓝桥杯简单模板

目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 ​编辑 位数分离 正写 ​编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法,例如现在让算一个49,21…

libVLC 提取视频帧使用OpenGL渲染

在上一节中,我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象,因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制,利用 GPU 减轻 CPU 计算负荷,本节讲解使用OpenGL来绘制每一帧视频…

【每日一题】2529. 正整数和负整数的最大计数-2024.4.9

题目: 2529. 正整数和负整数的最大计数 给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。 换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 pos 和 neg二者中…

A Survey for LLM

一、背景介绍 我们关注大模型中的两个主流:大语言模型和预训练的基础模型。01 大语言模型(LLMs) 语言建模是许多自然语言处理任务的基础,而大语言模型(LLMs)的初衷是为了提高语言建模的性能。与传统的神经语…

STM32之HAL开发——串行FLASH文件系统FatFs

文件系统 文件系统是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。 常见的 windows 下的文件系统格式包括 FAT32、 NTFS、exFAT。 在使用文件系统前,要先对存储介质进行格式化。格式化先擦除…

[LeetCode][LCR133]位 1 的个数——快速从右边消去1

题目 LCR 133. 位 1 的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 提示: 请注意,在某些语言…

多个代理proxy配置——日志查看代理后的地址

一个项目接口有两个域名,需要配置两个代理复制一个axios封装文件,修改baseUrl为新的标识 ququ新接口文件引入新的request1即可 proxy: {// 新接口采用 /ququ前缀/ququ: {target: http://192.168.2.82:8888, //鑫哥 changeOrigin: true,logLevel: debug, …

vue对比react18

1.模板语法-——>jsx JSX表达式用{}包裹&#xff0c;vue模板表达式用{{}}包裹&#xff0c;其余一致。 注意:if语句、switch语句、变量声明属于语句&#xff0c;不是表达式&#xff0c;不能出现在{}或{{}}中 <!--vue--> <template><div><p>I have…

Java开发面试题分享

目录 1、简述MyISAM和InnoDB的区别 2、简述Hash和B树索引的区别 3、简述MyBatis的实现逻辑 4、#{}和${}的区别 5、简述Mybatis的优缺点 6、当实体类中的属性名和表中的字段名不一样时怎么办&#xff1f; 7、resultType与resultMap的区别 8、如何执行批量插入 9、Mybat…

Unity自己实现的中英文的切换(简单好抄)

关键技术&#xff08;读取文件的方法&#xff0c;Split()分割字符串&#xff09; 1.搭建一个这样的场景&#xff0c;场景中有3个文本&#xff08;用新版的&#xff09;&#xff0c;一个空对象&#xff0c;一个按钮 2.编写翻译文本&#xff08;编写一个txt文本&#xff0c;在文…

腾讯云视频点播配置说明 | Modstart

开通云点播 开通云点播 云点播VOD_音视频点播_直播回看_音视频上传、存储转码AI处理方案-腾讯云 获取腾讯云 SecretId 和 SecretSecret 注册并且登录 腾讯云

14. 【Android教程】文本输入框 EditText

在上一节我们讲到了 TextView&#xff0c;它用来显示一段文本。这一节可以算作成是 TextView 的延续&#xff0c;因为从功能上 EditText 在 TextView 的基础之上多了一个输入的功能&#xff1b;从代码上 EditText 是继承自 TextView 的子类&#xff0c;所以我们可以大胆的理解为…

下载python电子书

下面展示一些 内联代码片。 import requests from lxml import etree from urllib import parse from pprint import pprint from tqdm import tqdm class PythonBook: def init(self): self.url“https://m.jb51.net/books/list476_1.html” self.url_page“https://m.jb51.n…

数字乡村发展新模式:科技创新引领农业现代化与乡村振兴协同发展

随着信息技术的飞速发展&#xff0c;数字乡村已成为新时代农业现代化与乡村振兴协同发展的新模式。科技创新作为推动这一模式的核心动力&#xff0c;正引领着乡村产业结构的优化升级&#xff0c;促进农村经济的全面振兴&#xff0c;让农民在现代化的进程中共享发展成果。 一、科…

transformer上手(1) —— transformer介绍

1 起源与发展 2017 年 Google 在《Attention Is All You Need》中提出了 Transformer 结构用于序列标注&#xff0c;在翻译任务上超过了之前最优秀的循环神经网络模型&#xff1b;与此同时&#xff0c;Fast AI 在《Universal Language Model Fine-tuning for Text Classificat…

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而电路和协…

基于Java SpringBoot+Vue的体育用品库存管理系统

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…