Spring声明式事务@Transactional的一些问题的测试及求证

news2024/10/5 18:27:14

1.Spring的声明式事务@Transactional问题

前提:有两个方法,a方法对a表做修改操作,b方法对b表做修改操作

a方法调用b方法,然后a方法报错,伪代码如下

public void a() {
    //数据库修改操作
    CompensateLogDO compensateLogDO = new CompensateLogDO();
    compensateLogDO.setId(IdWorker.getId());
    compensateLogDO.setCompensateLogType("123");
    compensateLogMapper.insert(compensateLogDO);

    fullCalcErrorService.b();

    int i = 1 / 0;
}

public void b() {
    //数据库修改操作
    FullCalcErrorDO fullCalcErrorDO = new FullCalcErrorDO();
    fullCalcErrorDO.setId(IdWorker.getId());
    fullCalcErrorDO.setRetryCount(0);
    fullCalcErrorDO.setProcessFlag(0);
    fullCalcErrorMapper.insert(fullCalcErrorDO);
}

a方法调用b方法,然后b方法报错,伪代码如下

public void a() {
    //数据库修改操作
    CompensateLogDO compensateLogDO = new CompensateLogDO();
    compensateLogDO.setId(IdWorker.getId());
    compensateLogDO.setCompensateLogType("123");
    compensateLogMapper.insert(compensateLogDO);

    fullCalcErrorService.b();
}

public void b() {
    //数据库修改操作
    FullCalcErrorDO fullCalcErrorDO = new FullCalcErrorDO();
    fullCalcErrorDO.setId(IdWorker.getId());
    fullCalcErrorDO.setRetryCount(0);
    fullCalcErrorDO.setProcessFlag(0);
    fullCalcErrorMapper.insert(fullCalcErrorDO);
    
    int i = 1 / 0;
}

直接上结果:

  • √:数据库插入成功
  • ×:数据库插入失败
    在这里插入图片描述

在 Spring Boot 中,默认情况下,对于单个数据库操作(即单个 SQL 语句的执行),是采用自动提交的方式。这意味着每次执行单个数据库操作后,都会立即将数据提交到数据库,不会等待其他操作或事务的完成。

2.@Transactional数据库连接问题

声明式事务管理建立在 AOP 之上的。其本质是通过 AOP 功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

也就是方法上加了@Transactional,在调用方法时就会获取一个数据库连接,并占用连接到方法结束;而不加@Transactional,只有执行到数据库(读或写)操作时才会获取一个数据库连接,数据库操作执行完就会释放连接

测试验证:

1.在两个方法都不加在@Transactional注解测试,分别在com.zaxxer.hikari.pool.HikariPool#getConnection()org.springframework.jdbc.datasource.DataSourceUtils#doGetConnection打上断点,执行到第一个数据库操作,进入断点,可以看到数据库连接为HikariProxyConnection@1230471455,释放断点,继续执行到第二个数据库操作,又会进入断点,可以看到数据库连接为HikariProxyConnection@1135602287,可以证明只有执行到数据库(读或写)操作时才会获取一个数据库连接,数据库操作执行完就会释放连接

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

2.在a方法上加@Transactional注解,b方法不加@Transactional注解,还是分别在com.zaxxer.hikari.pool.HikariPool#getConnection()org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin打上断点,方法一执行,就会获取数据库连接,这里是用代理获取的,可以看到数据库连接为HikariProxyConnection@1868392374,释放断点继续执行,可以发现后续数据库操作不会再获取连接,可以证明方法上加了@Transactional,在调用方法时就会获取一个数据库连接,并占用连接到方法结束

在这里插入图片描述

3.@Transactional(readOnly = true)问题

@Transactional(readOnly = true) 是Spring Framework中用来声明只读事务的注解。当一个方法被标记为@Transactional(readOnly = true)时,Spring将会确保在该方法的执行过程中,不会对数据库进行写操作,即只进行读操作。进行写操作会报错!!!

虽然@Transactional(readOnly = true)的主要目的是为了告诉Spring该方法只涉及读操作,但是它在底层仍然会占用一个数据库连接,这是因为Spring需要通过数据库连接来执行查询操作。然而,由于该方法只进行读取操作,Spring会尽可能地使用数据库的只读连接,从而减少对数据库的负担。

@Transactional(readOnly = true)主要的优势是在于告诉Spring该方法只进行读取操作,从而让Spring能够优化数据库连接的使用。它适用于那些纯粹的查询方法或者只读取数据而不涉及更新的业务逻辑。

什么时候使用@Transactional(readOnly = true)呢?

  • 纯读取操作: 如果某个方法完全是只读操作,不涉及数据库的写入(INSERT、UPDATE、DELETE),那么可以使用 @Transactional(readOnly = true) 来标记这个方法。这样Spring将会优化数据库连接的使用,使用只读连接,从而减少对数据库的负担。

  • 提高并发性能: 在高并发读取密集的场景下,通过将一些只读的查询操作标记为 @Transactional(readOnly = true) 可以提高并发性能。因为只读事务通常会使用数据库的共享锁(Shared Lock),不会阻塞其他只读事务,这样可以减少数据库的锁竞争,提高并发能力。

  • 避免意外修改: 使用 @Transactional(readOnly = true) 可以防止开发人员在只读方法中意外执行了写入操作。如果在只读事务中尝试执行写入操作,会抛出异常,从而避免数据的修改。

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

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

相关文章

英文论文(sci)解读复现【NO.14】基于关注机制的葡萄叶片病害检测

此前出了目标检测算法改进专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

【宝藏系列】STM32之C语言基础知识

【宝藏系列】STM32之C语言基础知识 文章目录 【宝藏系列】STM32之C语言基础知识1️⃣位操作2️⃣define宏定义3️⃣ifdef条件编译4️⃣extern变量声明5️⃣typedef类型别名 C语言是单片机开发中的必备基础知识,本文列举了部分 STM32 学习中比较常见的一些C语言基础知…

OAuth机制_web站点接入微软azure账号进行三方登录

文章目录 ⭐前言⭐微软三方登录流程💖 web站点获取微软账号流程💖 node封装微软登录接口💖 webapp 自定义code换token💖 调用 Microsoft Graph API💖 前端唤醒authlink进行登录回调逻辑 ⭐结束 ⭐前言 大家好&#xf…

React(1)——快速入门

一、React背景简介 官网和资料 英文官网: https://reactjs.org/中文官网: 快速入门 – React (docschina.org) 3、如果JS基础忘了及时查看文档:JavaScript - 学习 Web 开发 |多核 (mozilla.org) JavaScript - 标签 - 汤姆大叔 - 博客园 (cnblogs.com) 4、React…

day49-Todo List(待办事项列表)

50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List&#xff08;待办事项列表&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…

缓存数据同步技术Canal

说明&#xff1a;缓存数据同步&#xff0c;以Redis为例&#xff0c;如何保证从Redis中取出来的数据与MySQL中的一致&#xff1f;在微服务架构下&#xff0c;通常可以用以下两种技术来实现&#xff1a; MQ&#xff1a;在修改数据的同时&#xff0c;发送一个消息修改缓存&#x…

SpringBoot月度员工绩效考核管理系统【附任务书|ppt|万字文档(LW)和搭建文档】

主要功能 员工登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、绩效指标管理、绩效考核管理 管理员登录&#xff1a; ①首页、个人中心&#xff1a;修改密码、个人信息管理等 ②公告信息管理、部门管理、岗位管理、员工管理、绩效指标…

神奇数学世界的魔力迷踪:破解3的幂次方之谜

本篇博客会讲解力扣“326. 3 的幂”的解题思路&#xff0c;这是题目链接。 昨天刚刚讲解完2的幂&#xff0c;今天就来看看3的幂。 思路1 3的幂不能像2的幂那样&#xff0c;直接看二进制中是否有且仅有一位为1&#xff0c;所以“2的幂”那道题中的前两种方法就失效了&#xff…

《MySQL 实战 45 讲》课程学习笔记(一)

基础架构&#xff1a;一条 SQL 查询语句是如何执行的&#xff1f; MySQL 的基本架构 MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层 包括连接器、查询缓存、分析器、优化器、执行器&#xff1b;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&…

【雕爷学编程】MicroPython动手做(18)——掌控板之声光传感器2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

YOLOv5改进最新ICCV2023顶会LSKNet:大选择性卷积核的领域首次探索,助力小目标检测

YOLOv5改进最新ICCV2023顶会LSKNet:大选择性卷积核的领域首次探索,助力小目标检测 一、论文总结特征融合策略(即空间选择机制)二、代码部分,将LSKNet结构加入到YOLOv5中。论文:https://arxiv.org/pdf/2303.09030.pdf 代码https://github.com/zcablii/LSKNet/blob/main/mm…

【屏幕适配发展介绍 Objective-C语言】

一、接下来,我们花一天时间,给大家介绍这个屏幕适配 1.那么,屏幕适配,是什么意思啊 我们说,写程序的时候,我们有时候要做 1)系统适配 2)屏幕适配 1)系统适配:是指的你写的这个代码,在iOS6、iOS7、iOS8,在不同的iOS系统下,是不是运行的效果,一致吧 这个指的是…

【读书笔记】《太白金星有点烦》

哦吼&#xff01;这次开了一本轻松愉悦的书。 太白金星和观音分属于两个不同的部门&#xff0c;也有不同的领导&#xff0c;为了完成九九八十一难的策划而暂时合作。观音开始并瞧不上这个老头&#xff0c;对他极度欺瞒&#xff0c;但老头也不是任人揉捏的软柿子&#xff0c;给…

【雕爷学编程】MicroPython动手做(17)——掌控板之触摸引脚

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Tailwind CSS:基础使用/vue3+ts+Tailwind

一、理解Tailwind 安装 - TailwindCSS中文文档 | TailwindCSS中文网 Installation - Tailwind CSS 1.1、词义 我们简单理解就是搭上CSS的顺风车&#xff0c;事半功倍。 1.2、Tailwind CSS有以下优势 1. 快速开发&#xff1a;Tailwind CSS 提供了一些现成的 class / 可复用…

Redis如何实现排行榜?

今天给大家简单聊聊 Redis Sorted Set 数据类型底层的实现原理和游戏排行榜实战。特别简单&#xff0c;一点也不深入&#xff0c;也就 7 张图&#xff0c;粉丝可放心食用&#xff0c;哈哈哈哈哈~~~~。 1. 是什么 Sorted Sets 与 Sets 类似&#xff0c;是一种集合类型&#xff…

C++笔记之迭代器失效问题处理

C笔记之迭代器失效问题处理 code review! 参考博文&#xff1a;CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说&#xff0c;擦除&#xff08;erase&#xff09;元素会导致迭代器失效 一.使用返回…

PM2.5传感器(PMS5003)STM32代码

PM2.5传感器型号&#xff1a;PMS5003 PMS5003简介如下&#xff1a; 详情&#xff1a;PMS5003资料链接 PM2.5传感器代码下载&#xff0c;本人所写&#xff0c;亲测有效&#xff0c;基于STM32F407(其他STM32型号皆可移植&#xff0c;只需修改UART参数即可),UART打印数据

SpringBoot —程序包org.springframework.boot.test.context不存在

一. 遇到问题 &#xff1a;程序包org.springframework.boot.test.context不存在 发生错误的原因是项目中缺少spring-boot-starter-test依赖导致的&#xff0c;解决方案如下: 在项目根目录的pom.xm文件中的<dependencies>节点下增加以下依赖即可&#xff1a; <depen…

未来十年最确定的事

变量&#xff08;比如人工智能&#xff09;增加后&#xff0c;世界变成一个超复杂的系统&#xff0c;我们甚至不知道未来十年是战争还是和平&#xff0c;是增长还是震荡。但有一个事却百分百确定&#xff1a;硅基智能注定崛起&#xff0c;然后在生产、生活等各个环节反复和碳基…