网站建设费入如保入账,常见的跨境电商平台有哪些,苏州网站建设方法,做算命类网站违法吗?#x1f4d8; Spring 事务传播行为全景分析表#xff08;含代理与回滚细节#xff09; ✅ 一、A 和 B 在同一个类中 ⚠️ 本类方法互调#xff08;如 this.b()#xff09;不会经过 Spring 事务代理#xff0c;B 的事务注解将不生效 1. A 无事务#xff0c;B 为 Transact… Spring 事务传播行为全景分析表含代理与回滚细节 ✅ 一、A 和 B 在同一个类中 ⚠️ 本类方法互调如 this.b()不会经过 Spring 事务代理B 的事务注解将不生效 1. A 无事务B 为 Transactional(REQUIRED)
情况结果说明A 方法调用 Bthis.b()B 无事务不生效相当于普通方法B 方法报错无事务可回滚异常照常抛出或被处理 ✅ 结论B 的事务不生效A/B 都无事务行为 2. A 为 Transactional(REQUIRED)B 也为 Transactional(REQUIRED)
情况结果说明A 调用 Bthis.b()B 事务不生效相当于 B 方法加入 A 的事务上下文A 在调用 B 前报错A 回滚B 未调用A 调用 B 后报错A 回滚B 的数据也一起回滚B 报错A 感知异常回滚整个事务包括 B 部分 ✅ 结论B事务注解无效A 掌控整体事务 3. A 为 Transactional(REQUIRED)B 为 Transactional(REQUIRES_NEW)
情况结果说明A 调用 Bthis.b()B 的 REQUIRES_NEW 不生效等价于 REQUIREDA 调用 B 后 A 报错A 回滚B 数据也回滚B 报错异常回传A 事务回滚B 数据也回滚 ✅ 结论REQUIRES_NEW 无效表现等价于 REQUIRED ✅ 二、A 和 B 在不同类中 方法调用通过 Spring 容器代理对象完成事务注解均生效 1. A 为 Transactional(REQUIRED)B 为 Transactional(REQUIRED)
情况结果说明A 调用 B 前出错A 回滚B 未执行A 调用 B 后出错A 回滚B 作为同一个事务数据也回滚B 报错运行时异常整个事务回滚A BB 报错被 A 捕获若未手动标记 rollbackOnlyA 将正常提交 ⚠️ ✅ 结论A、B 属于同一个事务体彼此影响 2. A 为 Transactional(REQUIRED)B 为 Transactional(REQUIRES_NEW)
情况结果说明A 调用 B 前出错A 回滚B 未执行A 调用 B 后出错A 回滚B 独立事务 已提交不回滚B 报错运行时异常B 回滚A 接收异常是否回滚取决于是否捕获异常B 报错A 捕获异常A 正常提交B 回滚B 报错A 未捕获异常A 回滚由于异常传递B 已回滚不受影响 ✅ 结论B 与 A 为完全独立事务异常控制是否影响 A 看是否被捕获 总结对比表
场景A 是否回滚B 是否回滚说明同类A无事务B为REQUIRED❌❌B事务无效同类A为REQUIREDB为REQUIRED✅✅B事务失效实际加入A同类A为REQUIREDB为REQUIRES_NEW✅✅B事务失效表现等价于REQUIRED不同类A为REQUIREDB为REQUIRED✅✅同事务体共生共死不同类A为REQUIREDB为REQUIRES_NEWA未捕获B异常✅✅B先回滚异常传递导致A回滚不同类A为REQUIREDB为REQUIRES_NEWA捕获B异常❌✅A正常提交B单独回滚 建议 若希望 B 独立提交或失败不影响 A必须在不同类中使用 REQUIRES_NEW 并合理处理异常 若希望 所有操作属于一个事务体使用默认 REQUIRED确保 B 被代理 ⚠️ 尽量避免在同一个类中事务自调用或使用 ApplicationContext.getBean(this.getClass()).b() 替代 this.b() 来绕过代理问题。