分析Java中的@Transactional(readOnly = true)的作用(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. 性能对比

前言

对于Java的基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

而对于@Transactional的基本知识可看我之前的科普:

  1. 详细分析Java中的@Transactional注解
  2. 出现 Transaction rolled back because it has been marked as rollback-only 解决方法

1. 基本知识

@Transactional(readOnly = true) 是 Spring 框架中的一个注解,通常用于标记只读事务

所标注的方法或类中的所有数据库操作都是只读的,不会进行数据的修改操作,主要目的是优化事务处理,提高性能

基本的作用如下:

  • 优化性能:在只读事务中,数据库可以进行一些优化,例如避免脏数据检查,提高读取速度
  • 防止数据修改:显式声明只读事务,帮助开发人员和维护人员明确意图,防止误操作导致数据修改
  • 资源管理:在某些数据库系统中,只读事务可能会减少锁的竞争,提升并发性能

但是不可执行修改操作,而且在众多事务的情况下,如果有Bug,可能会多少影响事务,导致一直重试

2. 性能对比

对于大数据量的查询,可以大大优化查询速度(因个人项目而已,加之前最好也测试下效果明显不)

@Service
public class MyService {@Autowiredprivate MyRepository myRepository;@Transactional(readOnly = true)public List<MyEntity> getEntitiesReadOnly() {long startTime = System.currentTimeMillis();List<MyEntity> entities = myRepository.findAll();long endTime = System.currentTimeMillis();System.out.println("Read-only Transaction Time: " + (endTime - startTime) + " ms");return entities;}@Transactionalpublic List<MyEntity> getEntitiesReadWrite() {long startTime = System.currentTimeMillis();List<MyEntity> entities = myRepository.findAll();long endTime = System.currentTimeMillis();System.out.println("Read-write Transaction Time: " + (endTime - startTime) + " ms");return entities;}
}

理论的只读事务会比读写事务执行时间大大减少,但是实操发现波动不是很大,可能我的这个数据量不是很大

还有一个需要注意的点,如果服务层中有大量计算的数据,会让其长时间保持数据库链接,导致数据库链接匮乏

基本的规则以及注意事项如下:

  • 适用于只读操作:只在不涉及数据修改的操作上使用 @Transactional(readOnly = true)
  • 搭配缓存:结合缓存机制,可以进一步提升性能
  • 标记在类或方法上:可以标记在整个类上,表示类中所有方法都是只读的,也可以单独标记在方法上

注意点

谨慎使用嵌套事务:在使用嵌套事务时要小心,避免只读事务嵌套读写事务,导致意外问题。
防止误用:确保只读事务中不包含任何数据修改操作,否则会抛出异常。

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

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

相关文章

jstl是什么?

JSTL&#xff08;JavaServer Pages Standard Tag Library&#xff0c;Java 服务器页面标准标签库&#xff09;是一组用于简化 JSP 页面开发的标准标签和函数库。它提供了一组自定义的标签&#xff0c;使得开发者可以在 JSP 页面中使用这些标签来完成常见的任务&#xff0c;如条…

面向对象练习题

代码&#xff1a; public class LL {public static void main(String[] args) { Teacher tnew Teacher("Mike",32,"前端页面",20000);Professor P new Professor("Jack",58,"嵌入式开发",20000);pro p new pro("Bob",34,&q…

验证环境中uvm_error的使用

基本概念 作用&#xff1a;uvm_error 用于在验证过程中当发现不符合预期的情况时&#xff0c;生成并输出错误消息&#xff0c;帮助验证工程师快速定位和解决问题。语法&#xff1a;其基本语法为 uvm_error(ID, Message);&#xff0c;其中 ID 是一个唯一标识符&#xff0c;用于…

Leetcode热题100 Day4

开始做到二叉树了&#xff0c;前面的题全部用递归就能解决。 三十三、将有序数组转换为平衡二叉搜索树 二叉搜索树是左子树的值全小于根节点&#xff0c;右子树的值全大于根节点。二叉搜索树的中序遍历即为有序数组。但是有序数组和二叉搜索树是一一对应的吗&#xff1f;答案…

【规范】小程序发布,『小程序隐私保护指引』填写指南

前言 &#x1f34a;缘由 『小程序隐私保护指引』小程序发布&#xff0c;每次都躲不开&#xff01; &#x1f3c0;事情起因&#xff1a; 最近在帮朋友弄一个小项目&#xff0c;uniappunicloud壁纸小程序。虽然之前做过不少小程序&#xff0c;但是每次发布正式版本时都有一步『…

python入门课程Pro(2)--循环

循环 第1课 for循环的基本操作1.循环2.遍历3.for 循环遍历字典&#xff08;1&#xff09; 遍历字典的键(2)遍历字典的值(3)遍历字典的键和值 4.练习题&#xff08;1&#xff09;班级成绩单&#xff08;2&#xff09;最出名的城市&#xff08;3&#xff09;修改成绩&#xff08;…

WSL的安装

&#x1f3bc;个人主页&#xff1a;金灰 &#x1f60e;作者简介:一名简单的大一学生;易编橙终身成长社群的嘉宾.✨ 专注网络空间安全服务,期待与您的交流分享~ 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持&#xff01;❤️ &#x1f34a;易编橙终身成长社群&#…

Python--递归与非递归遍历文件夹的方法

递归概念 递归是一种编程技术&#xff0c;允许函数调用自身来解决问题。设计递归函数时&#xff0c;需要考虑基本情况和递归步骤。 递归函数设计 基本情况&#xff1a;递归结束的条件。递归步骤&#xff1a;函数调用自身解决更小的子问题。 递归方法实现 import osdef get…

网络初识和网络编程(Java版)

前言 网络已经成为我们日常生活中不可分割的一部分&#xff0c;我们每天都会从网络上得到各种各样的信息&#xff0c;我们也会在网络上传播各种各样的信息&#xff0c;可以说我们使用的软件都是依赖于网络的。作为一个程序猿&#xff0c;在我们未来部署的软件中&#xff0c;客…

【存储学习笔记】1:机械硬盘(Hard Drive Disk)结构和寻址方式

目录 HDD的结构HDD的寻址方式CHS寻址&#xff08;不适用于等密度结构磁盘&#xff09;LBA寻址&#xff08;目前普遍使用的线性寻址方式&#xff09; HDD的寻址速度 HDD的结构 盘面&#xff08;Platter&#xff09;&#xff1a;单面或者双面覆盖着用于记录数据的磁性物质&#x…

《昇思25天学习打卡营第25天|第23天》

今天是打卡的第二十三天&#xff0c;今天学习的是应用实践篇中的计算机视觉中FCN图像语义分割。 首先&#xff0c;是对全卷积网络&#xff08;FCN&#xff09;的简介&#xff0c;语义分割的简介&#xff0c;模型简介&#xff08;1、卷积化&#xff0c;2、上采样&#xff0c;3、…

OpenStack中nova的架构

1.1 nova-api 负责接收和相应客户的API调用。 1.2 compute core nova-schedule 负责决定在哪个计算节点运行虚拟机。 nova-compute 通过调用Hypervisor实现虚拟机生命周期的管理。一般运行在计算节点。 hypervisor 对虚拟机进行硬件虚拟化的管理软件&#xff…

初级java每日一道面试题-2024年7月21日-Collection和Collections的区别

面试官: Collection和Collections的区别? 我回答: 一、定义与功能 Collection 定义&#xff1a;Collection是Java集合框架中的一个基本接口&#xff0c;它代表了一组对象&#xff08;也称为元素&#xff09;的集合。它是List、Set等集合的父接口&#xff0c;定义了集合操作的…

Kali Linux APT 设置指南:如何控制软件包更新行为

在我浏览 CSDN 的问答社区时&#xff0c;我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章&#xff0c;帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们&#xff0c;特别是…

removeIf 方法设计理念及泛型界限限定

ArrayList 中的 removeIf 方法是 Java 8 中引入的集合操作方法之一。它使用了 Predicate 接口作为参数&#xff0c;以便根据指定的条件移除集合中的元素。以下是对 removeIf 方法入参设计的详细解释&#xff1a; Predicate 接口 Predicate 是一个函数式接口&#xff0c;定义了…

一线大厂java面试题

String 为什么要设计成不可变的 String被设计成不可变的有以下几个原因: 线程安全:由于String是不可变的&#xff0c;多个线程可以同时访问同一个String对象而无需担心数据被修改。这使得String在多线程环境下是线程安全1. 的。 2.缓存Hash值:由于String是不可变的&#xf…

接口性能优化思路

前言 日常开发中设计接口&#xff0c;响应时间是衡量一个接口质量的重要指标。 接口响应时间这里粗糙地分为三种&#xff1a; 即时响应&#xff1a;毫秒级&#xff0c;小于500毫秒快速响应&#xff1a;秒级&#xff0c;大于500毫秒且小于2秒长时间操作&#xff1a;大于2秒&a…

【Python其他检查字符串占字节数的方法】

在Python中&#xff0c;检查字符串在特定编码下占用的字节数&#xff0c;最标准且常用的方法是通过字符串的.encode()方法将字符串转换为字节串&#xff0c;然后使用len()函数来获取这个字节串的长度。这是因为字符串&#xff08;在Python 3中&#xff09;是以Unicode形式存储的…

力扣题解(一和零)

474. 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 思路&#xff1a; 本题可以看成有两个限…

51单片机嵌入式开发:15、STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒

STC89C52RC操作蜂鸣器实现一个music音乐播放器的音乐盒 1 概述2 蜂鸣器操作方法3 蜂鸣器发出音声4 硬件电路5 软件实现6 整体工程&#xff1a;7 总结 1 概述 要实现一个基于STC89C52RC单片机的音乐盒&#xff0c;可以按照以下步骤进行&#xff1a; &#xff08;1&#xff09;硬…