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

Spring 框架中事务传播行为的定义

这个 Propagation 枚举是 Spring 框架中事务传播行为的定义,它用于指定事务方法在调用另一个事务方法时,事务应该如何传播。这是在 Spring 的 @Transactional 注解中使用的关键配置之一。

事务传播行为详解

以下是每种传播行为的详细解释:

1. REQUIRED (0) - 必需(默认值)

  • 行为:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

  • 使用场景:最常用的传播行为,适用于大多数业务操作。

2. SUPPORTS (1) - 支持

  • 行为:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

  • 使用场景:适用于那些不需要事务但可以在有事务时参与事务的方法,如查询操作。

3. MANDATORY (2) - 强制

  • 行为:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

  • 使用场景:要求必须在已有事务中执行的方法,如果不是在事务中调用则会报错。

4. REQUIRES_NEW (3) - 新建

  • 行为:创建一个新的事务,如果当前存在事务,则把当前事务挂起。

  • 使用场景:需要独立事务的操作,不受外部事务回滚的影响(如日志记录)。

5. NOT_SUPPORTED (4) - 不支持

  • 行为:以非事务方式执行操作,如果当前存在事务,则把当前事务挂起。

  • 使用场景:需要在非事务环境下执行的操作,不希望受到事务管理的影响。

6. NEVER (5) - 从不

  • 行为:以非事务方式执行,如果当前存在事务,则抛出异常。

  • 使用场景:明确要求不能在事务中执行的操作。

7. NESTED (6) - 嵌套

注意事项

这个 Propagation 枚举是 Spring 事务管理的核心组成部分,它提供了灵活的事务边界控制能力,帮助开发者构建健壮的应用程序

  • 行为:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。

  • 使用场景:复杂业务中需要部分回滚的场景,嵌套事务可以独立回滚而不影响外部事务。

    @Service
    public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate LogService logService;// 默认使用 REQUIRED 传播行为@Transactionalpublic void createUser(User user) {userRepository.save(user);}// 明确指定传播行为@Transactional(propagation = Propagation.REQUIRES_NEW)public void updateUserWithNewTransaction(User user) {userRepository.update(user);}// 组合使用不同传播行为的方法@Transactional(propagation = Propagation.REQUIRED)public void complexOperation(User user) {userRepository.save(user); // 参与当前事务// 创建一个独立的新事务,不受当前事务回滚影响logService.auditLog("User created: " + user.getName());}
    }@Service
    public class LogService {@Transactional(propagation = Propagation.REQUIRES_NEW)public void auditLog(String message) {// 这个操作会在独立事务中执行// 即使调用方事务回滚,这个日志记录也会被提交}
    }

    实际应用场景

  • 资金转账:使用 REQUIRED 确保扣款和加款在同一个事务中

  • 操作日志记录:使用 REQUIRES_NEW 确保即使业务操作失败,日志也能被记录

  • 数据校验:使用 SUPPORTS 或 NOT_SUPPORTED 进行不需要事务的简单查询

  • 批量处理:使用 NESTED 实现部分失败部分成功的复杂业务逻辑

  • 默认的传播行为是 REQUIRED,这也是最常用的选项

  • NESTED 传播行为需要底层数据库支持保存点(Savepoint)

  • 传播行为的选择会影响应用的性能和数据一致性

  • 理解不同传播行为的区别对于设计正确的事务边界至关重要

http://www.dtcms.com/a/355335.html

相关文章:

  • 146. LRU缓存
  • python使用sqlcipher4对sqlite数据库加密
  • 【论文阅读】基于人工智能的下肢外骨骼辅助康复方法研究综述
  • 【电源专题】隐形守护者:防爆锂电池如何守护高危环境的安全防线
  • UE5提升分辨率和帧率的方法
  • 网站日志里面老是出现{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22.....
  • Leetcode 深度优先搜索 (15)
  • 【大前端】React Native(RN)跨端的原理
  • 比较两个字符串的大小
  • 使用CDN后如何才不暴露IP
  • EtherNet/IP 转 Modbus 协议网关(三格电子)
  • SOME/IP-SD通信中的信息安全保证
  • leetcode_73 矩阵置零
  • (LeetCode 面试经典 150 题) 103. 二叉树的锯齿形层序遍历(广度优先搜索bfs)
  • [n8n] 工作流数据库管理SQLite | 数据访问层-REST API服务
  • 解决PyCharm打开PowerShell终端报错找不到conda-hook.ps1文件
  • 前端javascript在线生成excel,word模板-通用场景(免费)
  • Spring Boot 定时任务入门
  • 使用Java实现PDF文件安全检测:防止恶意内容注入
  • ubuntu20安装lammps
  • PDFMathTranslate,完全免费的电脑 PDF 文档翻译软件
  • 怎么保护信息安全?技术理论分析
  • Shell 脚本编程规范与变量
  • [调试][实现][原理]用Golang实现建议断点调试器
  • 裸金属服务器与虚拟机、物理机的核心差异是什么?
  • 鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(二)
  • Kea DHCP高危漏洞CVE-2025-40779:单个数据包即可导致服务器崩溃
  • 获取小红书某个用户列表
  • Swift 解法详解 LeetCode 365:水壶问题
  • day083-Filebeat数据采集案例与Kibana可视化应用