发布时间:2025-11-04 00:19:02 来源:云智核 作者:域名
环境:SpringBoot3.4.2
@Transactional 是性能性 Spring 中用于声明式事务管理的核心注解,旨在简化数据库事务操作。优化影响在传统的种场编程式事务中,我们需手动编写事务的景下开启、提交或回滚代码,使用而通过 @Transactional 注解将事务逻辑与业务代码解耦。性能性只需在方法或类上添加该注解,优化影响Spring 会基于 AOP(面向切面编程)自动拦截调用,种场在方法执行前开启事务,景下执行后根据异常情况提交或回滚。使用这种设计显著提升了代码的性能性可读性和可维护性。
但如果滥用@Transactional,优化影响会对系统性能产生显著负面影响,种场主要体现在以下几个方面:
过度使用会导致事务范围过大,景下延长数据库连接占用时间,使用增加锁竞争和死锁风险不必要的细粒度事务会引发频繁的提交和回滚操作,加重数据库负载在非关键数据操作或只读场景中滥用事务,会无谓消耗系统资源,降低整体吞吐量。IT技术网本篇文章会介绍基于 JPA 和 JDBC 时,@Transactional 注解对查询性能的影响。
纯查询到底要不要事务?
图片
测试1,不使用@Transactional注解
复制private final UserRepository userRepository ; public User queryUser() { return this.userRepository.findById(4888888).orElse(null) ; }1.2.3.4.使用JMeter测试结果如下:
图片
吞吐量平均:9700
测试2,使用@Transactional
复制@Transactional public User queryUser() {}1.2.使用JMeter测试结果如下:
图片
吞吐量平均:12700
这是否打破了你原有的认知呢?按照常规理论,使用 @Transactional 注解通常会使性能变差,然而当前呈现的数据却表明,使用该注解后性能反而有所提升。
测试3,使用只读事务
复制@Transactional(readOnly = true) public User queryUser() {}1.2.使用JMeter测试结果如下:
图片
吞吐量平均:9300
该结果与不使用注解相差不大。
思考:为什么使用了@Transactional注解反而性能更高呢?欢迎大家留言讨论。
2.3 使用JDBC查询测试1,不使用@Transactional注解
复制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<User>() { @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 ; } }) ; }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.JMeter测试结果:
图片
吞吐量平均:25000
JPA是简单了,代价就是性能太差了。
测试2,使用@Transactional注解
复制@Transactional public User queryUser() {}1.2.JMeter测试结果:

吞吐量平均:13100
这倒是符合我们的预期,使用了@Transactional注解性能明显下降。企商汇
测试3,使用只读事务
复制@Transactional(readOnly = true) public User queryUser() {}1.2.JMeter测试结果:
图片
同样符合预期,与读写事务差不多。
2.4 使用EntityManager查询测试1,不使用@Transactional注解
复制private final EntityManager em ; public User queryUser() { return this.em.find(User.class, 4888888) ; }1.2.3.4.JMeter测试结果:
图片
吞吐量平均:24000
测试2,使用@Transactional注解
复制@Transactional public User queryUser() { return this.em.find(User.class, 4888888) ; }1.2.3.4.JMeter测试结果:
图片
吞吐量平均:13000
测试3,使用只读事务
复制@Transactional(readOnly = true) public User queryUser() {}1.2.JMeter测试结果:
图片
吞吐量平均:9800
2.5 性能柱状图
图片
如下多个查询使用事务保证了同一时间点的网站模板数据:
复制private final UserRepository userRepository ; private final OrderRepository orderRepository ; @Transactional(readOnly = true) public UserInfoDto getUserInfo(Long userId) { User user = userRepository.findById(userId); List<Order> orders = orderRepository.findByUserId(userId); return new UserInfoDto(user, orders); }1.2.3.4.5.6.7.8.9.10.