当前位置: 首页 > java >正文

Java + Spring Boot + MyBatis 事务注解 @Transactional 使用规范说明

在Spring Boot + MyBatis项目中,并非每个Service方法都需要添加@Transactional注解。是否添加该注解取决于具体业务场景和操作需求。以下是详细分析:


一、必须使用@Transactional的场景

  1. 多数据库操作需原子性
    当方法内包含多个数据库写操作(如多个INSERT/UPDATE/DELETE),且需要保证这些操作要么全部成功,要么全部失败时,必须使用事务。
    示例:转账操作(扣款+加款)

    java

    复制

    下载

    @Transactional
    public void transferMoney(Long from, Long to, BigDecimal amount) {accountMapper.deduct(from, amount);// 此处若发生异常,扣款操作会回滚accountMapper.add(to, amount);
    }
  2. 跨Service方法调用
    如果Service方法A调用了其他Service方法B和C,且这些操作需要作为一个整体,则应在A上添加事务注解。


二、无需使用@Transactional的场景

  1. 单一查询操作
    纯查询方法(SELECT)通常不需要事务。但若要求强一致性(如避免脏读),可添加只读事务:

    java

    复制

    下载

    @Transactional(readOnly = true) // 优化性能,避免写锁
    public User getUserById(Long id) {return userMapper.selectById(id);
    }
  2. 单一写操作
    如果方法仅含一个写操作(如单个INSERT),数据库本身已保证原子性,可不加事务。

    注意:某些场景仍需事务(如需要回滚后续非DB操作)。

  3. 非数据库操作
    方法内无任何数据库操作(如计算逻辑、调用外部API)时,不需要事务。


三、最佳实践建议

  1. 在Service层添加注解
    事务注解应加在Service层而非Mapper层,确保业务逻辑完整性。

  2. 显式配置事务属性
    明确指定传播行为、隔离级别、超时时间等:

    java

    复制

    下载

    @Transactional(propagation = Propagation.REQUIRED, // 默认:当前有事务则加入,无则新建isolation = Isolation.DEFAULT,       // 使用数据库默认隔离级别timeout = 30,                       // 超时时间(秒)rollbackFor = Exception.class       // 指定回滚的异常类型
    )
    public void businessMethod() { ... }
  3. 避免事务滥用
    不必要的事务会增加性能开销(如获取/释放连接、事务同步等)。

  4. 只读查询显式标记
    查询方法建议添加@Transactional(readOnly = true),帮助数据库优化执行。


四、常见误区

  • 误区:所有方法都加事务更“安全”。
    纠正:过度使用事务可能导致死锁、性能下降、连接池耗尽等问题。

  • 误区:事务能解决所有一致性需求。
    纠正:分布式场景需结合分布式事务(如Seata)或最终一致性方案。


五、总结

场景是否需要@Transactional
多数据库写操作✅ 必须
跨方法组合操作✅ 必须
单一查询(强一致性要求)⚠️ 建议只读事务
单一写操作(仅1次INSERT/UPDATE)❌ 通常不需要
非数据库操作❌ 不需要

核心原则

根据业务逻辑的原子性需求决定是否使用事务,而非盲目添加。始终优先考虑性能与场景的匹配性。

http://www.xdnf.cn/news/13357.html

相关文章:

  • Jenkins + Docker + Kubernetes(JKD)在 DevOps CI/CD 中的核心价值与实践要点
  • DevSecOps实践:CI/CD流水线集成动态安全测试(DAST)工具
  • 专题:2025中国游戏科技发展白皮书报告汇总解读|附130+份报告PDF汇总下载
  • MySQL插入全攻略:单条vs批量,如何选择最优方案?​
  • 基于AI智能体的医疗AI工具库构建路径分析
  • java--认识反射
  • Java八股文——Spring「SpringMVC 篇」
  • 计算机视觉与深度学习 | 两种经典的低照度增强算法:多尺度Retinex(MSR)和自适应直方图均衡化(CLAHE)
  • 6个月Python学习计划 Day 21 - Python 学习前三周回顾总结
  • 【11408学习记录】[特殊字符] 速解命题核心!考研数学线性代数:4类行列式满分技巧(含秒杀公式)​
  • 游戏引擎学习第315天:取消排序键的反向顺序
  • python精讲之python基础
  • Seaborn入门到上头:让数据可视化变成享受的艺术(附防秃指南)
  • Node.js Conf 配置库要点分析 和 使用注意事项
  • Hive的索引使用如何优化?
  • JavaSE-Java简史
  • uni-app学习笔记三十六--分段式选项卡组件的使用
  • 【Java】Arrays.sort:TimSort
  • 1005. Maximize Sum Of Array After K Negations
  • 应用无法获取用户真实ip问题排查
  • 列表关联数据默认选中分析
  • MySQL 8.0 OCP 英文题库解析(十六)
  • GaussDB分布式数据库调优方法总结:从架构到实践的全链路优化指南
  • 车载软件和整车电子架构正重新定义汽车行业
  • 浏览器拓展-玻璃质感下载管理器
  • < 买了个麻烦 (二) 618 京东云--轻量服务器 > 可以为您申请全额退订呢。 挣取来的,东京云 轻量服务器,可以“全额退款“
  • PyCharm Python IDE
  • 微机原理与接口技术,期末冲刺复习资料(六)
  • openeuler系统(CentOs)图形化桌面黑屏/丢失(开启VNC服务冲突)
  • gbase8s数据库获取jdbc/odbc协议的几种方式