首页 游戏 软件 资讯 排行榜 专题
首页
科技数码
@Transactional性能优化:3种适用场景与避坑指南

@Transactional性能优化:3种适用场景与避坑指南

热心网友
86
转载
2025-12-02

@Transactional 注解作为 Spring 框架中声明式事务管理的核心组件,能够显著简化数据库事务操作。在传统编程式事务开发中,开发人员需要手动编写事务开启、提交和回滚的样板代码,而通过该注解则能实现事务逻辑与业务代码的优雅解耦。

运行环境:SpringBoot3.4.2

1. 核心概念解析

@Transactional 注解是 Spring 实现声明式事务管理的关键机制,其设计初衷在于降低数据库事务操作的复杂度。只需在方法或类级别添加该注解,Spring 便会基于 AOP(面向切面编程)技术自动拦截方法调用,在执行前开启事务,完成后根据异常情况自动提交或回滚。这种设计不仅提高了代码可读性,更增强了系统的可维护性。

但若不当使用该注解,可能会对系统性能产生显著的负面影响,主要体现在以下几个方面:

过度使用会导致事务范围扩大,延长数据库连接占用时间,增加锁竞争和死锁风险。不必要的事务细化会引发频繁的提交和回滚操作,加重数据库负担。在非关键数据操作或纯读场景中滥用事务,会造成系统资源的无谓消耗,从而降低整体吞吐量。

本文将重点探讨基于 JPA 和 JDBC 时,@Transactional 注解对查询性能的具体影响。

纯查询场景下究竟是否需要开启事务?

2. 实战性能测试

2.1 测试环境搭建

配置文件

spring: datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/batch username: root password: 123123 type: com.zaxxer.hikari.HikariDataSource hikari: minimumIdle: 10 maximumPoolSize: 10 jpa: generateDdl: false hibernate: ddlAuto: update openInView: true show-sql: false

实体对象定义

@Entity @Table(name = "o_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private Integer age; private String phone; private String sex; // 省略getter/setter方法 }

接口配置

@GetMapping("") public ResponseEntity query() { return ResponseEntity.ok(this.userService.queryUser()); }

测试数据准备(500万条)

图片图片

2.2 Repository查询性能对比

测试场景1:无事务注解

private final UserRepository userRepository; public User queryUser() { return this.userRepository.findById(4888888).orElse(null); }

JMeter压力测试结果:

图片图片

平均吞吐量:9700

测试场景2:启用事务注解

@Transactional public User queryUser() {}

JMeter压力测试结果:

图片图片

平均吞吐量:12700

测试场景3:配置只读事务

@Transactional(readOnly = true) public User queryUser() {}

JMeter压力测试结果:

图片图片

平均吞吐量:9300

这个结果与不使用注解时差异不大。

思考:为何使用@Transactional注解后性能反而有所提升?欢迎大家留言探讨。

2.3 JDBC查询性能分析

测试场景1:无事务注解

private final JdbcTemplate jdbcTemplate; public User queryUser() { return this.jdbcTemplate.queryForObject( "select id, name, age, phone, sex from o_user where id = 4888888", new RowMapper() { @Override public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setAge(rs.getInt("age")); user.setName(rs.getString("name")); user.setPhone(rs.getString("phone")); user.setSex(rs.getString("sex")); return user; } }); }

JMeter测试结果:

图片图片

平均吞吐量:25000

JPA确实简化了开发,但代价就是性能表现较差。

测试场景2:启用事务注解

@Transactional public User queryUser() {}

JMeter测试结果:

图片

平均吞吐量:13100

这个结果符合我们的预期,使用@Transactional注解后性能明显下降。

测试场景3:配置只读事务

@Transactional(readOnly = true) public User queryUser() {}

JMeter测试结果:

图片图片

平均吞吐量:9800

同样符合预期,与读写事务的表现基本相当。

2.4 EntityManager查询测试

测试场景1:无事务注解

private final EntityManager em; public User queryUser() { return this.em.find(User.class, 4888888); }

JMeter测试结果:

图片图片

平均吞吐量:24000

测试场景2:启用事务注解

@Transactional public User queryUser() { return this.em.find(User.class, 4888888); }

JMeter测试结果:

图片图片

平均吞吐量:13000

测试场景3:配置只读事务

@Transactional(readOnly = true) public User queryUser() {}

JMeter测试结果:

图片图片

平均吞吐量:9800

2.5 性能数据可视化

图片图片

2.6 查询场景事务使用总结

保证数据一致性:在事务范围内,所有查询都能看到同一时间点的数据快照(具体取决于隔离级别),有效避免其他事务中途修改导致的数据不一致问题。

性能优化策略:Spring 提供 @Transactional(readOnly = true) 配置,明确标记只读事务。这能让底层数据库(如 Oracle、MySQL InnoDB)进行针对性优化,比如启用只读快照、减少锁竞争等。连接复用优势:同一事务中的多个操作可以复用数据库连接,减少连接创建和释放的开销。与写操作兼容:如果查询方法被包含在更大的写事务中,有 @Transactional 注解可以无缝集成。

如下多个查询使用事务保证了同一时间点的数据:

private final UserRepository userRepository; private final OrderRepository orderRepository; @Transactional(readOnly = true) public UserInfoDto getUserInfo(Long userId) { User user = userRepository.findById(userId); List orders = orderRepository.findByUserId(userId); return new UserInfoDto(user, orders); }


来源:https://www.51cto.com/article/826703.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Spring Boot YAML配置文件加密方法详解
网络安全
Spring Boot YAML配置文件加密方法详解

SpringBoot项目中,敏感数据直接写入配置文件存在泄露风险。通过集成Jasypt工具,可对YAML文件中的密码、密钥等信息进行加密。具体步骤包括添加依赖、生成并妥善保管加密密钥、使用ENC()包裹密文、配置解密密钥,并在主类添加@EnableEncryptableProperties注解。应用启动时将自动解密,从而安全地管理配置,兼顾便利与安全性。

热心网友
05.06
spring properties文件可以加密吗
网络安全
spring properties文件可以加密吗

SpringProperties文件可加密以保护敏感信息。主流方法包括借助外部工具加密文件后启动时解密,或利用框架注解对特定属性标记并自动解密。加密能有效防止数据库密码等密钥明文存储导致的泄露风险,是重要的安全实践。

热心网友
05.06
Spring Properties配置文件如何实现加密保护
网络安全
Spring Properties配置文件如何实现加密保护

SpringProperties支持加密敏感信息。通过Jasypt库,可在配置文件中以特定语法标记加密属性,保障存储与传输安全。集成到SpringBoot后,应用启动时自动解密,业务代码无需感知。该方案轻量且非侵入,能有效提升应用安全性。

热心网友
05.06
spring security如何防范常见攻击
网络安全
spring security如何防范常见攻击

Spring Security:构筑Ja va应用安全的坚实盾牌 在构建企业级Ja va应用时,安全绝非可选项,而是基石。Spring Security正是为此而生的强大框架,它提供了一套高度可定制化的安全解决方案,能够系统性地抵御多种常见的网络威胁。下面这张图清晰地概括了它的核心防御领域: 具体来

热心网友
04.29
2026年你以为会写 Java 就够了?这十个底层认知,决定你天花板在哪
业界动态
2026年你以为会写 Java 就够了?这十个底层认知,决定你天花板在哪

别再把问题归咎于框架,很多坑其实早就写在基础里 做Ja va开发这些年,一个反复出现的场景总让人印象深刻: 系统上线后突然变慢、某个接口时好时坏、对象状态莫名其妙“丢了”、或者从Map里死活取不出值来…… 遇到这种事,第一反应往往是去翻框架文档:是不是Spring Boot配置不对?是不是微服务调用

热心网友
04.22

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

英特尔酷睿Ultra游戏本性能解析:AI加持下的全新体验
AI
英特尔酷睿Ultra游戏本性能解析:AI加持下的全新体验

根据Gartner最新市场报告,2025年全球PC出货量突破2 7亿台,同比增长9 1%。在人工智能技术浪潮与AI PC算力升级需求的双重驱动下,整个PC行业正迈入一个全新的增长周期。作为细分市场的重要力量,游戏笔记本电脑也迎来了关乎性能、体验与场景定义的关键换代节点。 回顾行业发展,英特尔于202

热心网友
05.15
TUSD稳定币详解:TrueUSD项目背景、主要用途与投资风险全解析
web3.0
TUSD稳定币详解:TrueUSD项目背景、主要用途与投资风险全解析

TUSD是一种与美元1:1锚定的合规稳定币,由TrustToken团队推出。它通过第三方机构定期审计和银行账户托管确保透明度,旨在提供可靠的数字美元解决方案。其用途涵盖交易、支付、DeFi及跨境结算,但用户仍需关注其中心化托管、监管变化及智能合约安全等潜在风险。

热心网友
05.15
OpenClaw Peekaboo v3发布:机器人视觉抓取技术实现一日三更
AI
OpenClaw Peekaboo v3发布:机器人视觉抓取技术实现一日三更

OpenClaw 生态中那个关键的“眼睛”和“手”——Peekaboo v3,正式回归了。这不仅是一次版本更新,更像是一次关键的“补完”。它让 AI 不再只是停留在聊天框里给出建议,而是真正获得了观察屏幕、点击按钮、操作真实桌面的能力。 过去几个月,OpenClaw 的热度经历了一个典型的周期:从概

热心网友
05.15
微信小程序找个球全关卡通关攻略图文详解
游戏攻略
微信小程序找个球全关卡通关攻略图文详解

微信小游戏《找个球》,玩的就是眼力。每张看似相同的图片里,都藏着好几处“破绽”——有的明显,有的则隐蔽得让人抓狂。从简单的卧室场景,到复杂的宴会、雨夜,关卡越往后,画面细节越多,挑战也越大。想通关?秘诀就一个:沉住气,从左到右,一寸一寸地对比。 为了方便大家攻克难关,这里整理了一份全关卡通关攻略图合

热心网友
05.15
找个球第10关怎么过 图文通关步骤详解
游戏攻略
找个球第10关怎么过 图文通关步骤详解

《找个球》第10关攻略详解:如何快速找出15处不同?本关场景围绕经典角色“嬛嬛”与“大胖橘”展开,挑战在于发现两幅图片间的细微差别。这些差异点主要隐藏在人物的发饰造型、衣领褶皱、服饰花纹等细节处。同时,背景中的花草形态、秋千绳索乃至庭院摆设也可能存在巧妙改动。想要高效通关,建议玩家采用分区对比法,先

热心网友
05.15