Spring事务传播机制详解:线上事务失效经典案例复盘 做Java后端开发Spring事务应该是每天都在接触的功能。但我发现大部分开发者只会简单加一个Transactional注解对事务传播机制一知半解。平时开发功能简单测不出来问题。一旦项目复杂、出现多层Service嵌套调用就会出现明明抛异常了数据库却没回滚、部分数据插入成功、数据一致性错乱。我之前线上就踩过一个非常经典的坑外层方法事务正常内层方法报错结果内层数据没回滚直接导致生产产生脏数据。排查半天最后定位原因就是事务传播类型用错。今天我结合真实线上事故通俗讲透Spring七大事务传播机制重点复盘高频失效场景附带错误代码、优化代码帮大家彻底杜绝事务失效问题。一、先搞懂什么是事务传播机制简单来说事务传播机制就是当一个带事务的方法调用另一个带事务的方法时事务该如何传递、创建、挂起的规则。二、线上经典事故内层报错不回滚高频坑我直接还原当时线上出错的业务场景外层新增订单、内层新增订单日志内层方法抛出异常预期整体事务回滚结果订单数据入库成功只日志失败数据不一致。错误业务代码事务失效源码Service public class OrderService { Autowired private LogService logService; // 默认传播机制 REQUIRED Transactional(rollbackFor Exception.class) public void createOrder() throws Exception { // 1. 创建订单 saveOrder(); // 2. 调用内层日志方法 logService.saveOrderLog(); } public void saveOrder(){ // 模拟订单入库 System.out.println(订单入库成功); } }Service public class LogService { // 内层独立事务 Transactional(propagation Propagation.REQUIRES_NEW) public void saveOrderLog() throws Exception { // 模拟日志保存 System.out.println(日志记录异常); // 手动抛出异常 throw new RuntimeException(日志保存失败); } }最终现象内层报错回滚了自己外层订单事务正常提交没有回滚。很多新手完全看不懂为什么会这样其实就是传播机制特性导致的REQUIRES_NEW会挂起外层事务新开独立事务。内层回滚只会回滚自己不会影响外层事务提交。三、四大常用传播机制通俗讲解开发必懂我不讲官方晦涩文档用大白话给大家总结日常能用的四种1、REQUIRED默认当前有事务就加入没有就新建。最常用、最稳适合绝大多数业务场景保证整体原子性。2、REQUIRES_NEW无论外层有没有事务都新建独立事务。内外事务互不干扰适合日志记录、消息留存这种失败不影响主业务的场景。3、SUPPORTS有事务就跟着跑没事务就无事务执行。查询接口首选避免事务开销。4、NESTED嵌套事务外层回滚内层必回滚内层异常不影响外层。适合子任务独立容错场景。四、事故修复正确事务写法如果我的需求是日志失败订单也要整体回滚就不能用REQUIRES_NEW直接使用默认REQUIRED即可。Transactional(rollbackFor Exception.class) public void saveOrderLog() throws Exception { System.out.println(日志记录异常); throw new RuntimeException(日志保存失败); }修改后内外层共用同一个事务内层抛异常整体事务感知异常全部回滚数据完全一致。五、额外高频坑内部调用导致事务彻底失效除了传播机制用错还有一个新手必踩坑同类内部方法调用事务直接失效。如下代码事务完全不生效异常不会回滚public void submit(){ // 内部调用AOP无法拦截 this.create(); } Transactional public void create(){ // 数据库操作 抛异常 throw new RuntimeException(出错); }原因是Spring事务基于AOP动态代理内部this调用不走代理对象注解直接失效。解决方式通过注入自身Bean调用或者拆分服务。六、线上事务避坑总结复盘完这次线上问题我给团队定了三条开发规范基本再也没出现过事务错乱问题1、核心交易、订单、支付业务统一使用默认 REQUIRED保证整体原子性 2、日志、统计、非核心附属记录按需使用 REQUIRES_NEW不影响主流程 3、禁止同类方法内部调用事务方法杜绝AOP失效。总结很多人觉得Spring事务很简单实际上传播机制乱用、内部调用、异常捕获不规范是线上数据不一致的重灾区。不要只会无脑加Transactional真正理解传播机制原理根据业务场景合理选择才能从根源避免脏数据、事务失效、数据不一致等线上重大BUG。9eh.4-p.cNvA5.4-p.cNh1t.4-p.cN5yx.4-p.cNDCz.4-p.cN3zt.4-p.cNoDr.4-p.cNqkg.4-p.cN2vh.4-p.cNr7k.4-p.cNv7o.4-p.cN401.4-p.cNn61.4-p.cN7iB.4-p.cN4Dl.4-p.cNjz7.4-p.cNqu2.4-p.cNkgt.4-p.cN2ku.4-p.cNixD.4-p.cNyp2.4-p.cNl3D.4-p.cNo9h.4-p.cN4xv.4-p.cNBfq.4-p.cN6wp.4-p.cNxvo.4-p.cNhB1.4-p.cN266.4-p.cNm7C.4-p.cNtmu.4-p.cNxvg.4-p.cNyB7.4-p.cN5n4.4-p.cNsp0.4-p.cN6Cq.4-p.cNBok.4-p.cNpAk.4-p.cNy3m.4-p.cN350.4-p.cNvxA.4-p.cN5yu.4-p.cNuxv.4-p.cNq7j.4-p.cN771.4-p.cNyx8.4-p.cNge7.4-p.cN3fA.4-p.cNf55.4-p.cN25A.4-p.cN8Dw.4-p.cNttn.4-p.cNu5v.4-p.cNCs0.4-p.cNh63.4-p.cN6k2.4-p.cNpBo.4-p.cNsnj.4-p.cNjCn.4-p.cNn23.4-p.cN2Bm.4-p.cN5yC.4-p.cN83j.4-p.cN996.4-p.cNk4o.4-p.cNyil.4-p.cNy6p.4-p.cN08j.4-p.cNA45.4-p.cN2Bk.4-p.cNhn0.4-p.cNjnl.4-p.cNCmo.4-p.cN97x.4-p.cN4q3.4-p.cNe7v.4-p.cN8hC.4-p.cNgjy.4-p.cNsnz.4-p.cNDCj.4-p.cNimg.4-p.cN7zA.4-p.cNoyp.4-p.cNog6.4-p.cNe1k.4-p.cN5fC.4-p.cNAgf.4-p.cNjol.4-p.cN37x.4-p.cN032.4-p.cNlqp.4-p.cNkq2.4-p.cNj7m.4-p.cNx8x.4-p.cNpm5.4-p.cN1qx.4-p.cNBrj.4-p.cN82n.4-p.cNe6x.4-p.cN4rq.4-p.cNBmr.4-p.cNliC.4-p.cN5wt.4-p.cNl57.4-p.cNfsy.4-p.cN6h1.4-p.cNCsx.4-p.cNz3C.4-p.cNzrq.4-p.cNmq8.4-p.cNy6j.4-p.cNvAC.4-p.cN0xC.4-p.cNzvf.4-p.cNwox.4-p.cNmrq.4-p.cN595.4-p.cN6zu.4-p.cNtfg.4-p.cNCu3.4-p.cNugz.4-p.cNqB1.4-p.cNz83.4-p.cNp33.4-p.cN2se.4-p.cN6o1.4-p.cN9Aq.4-p.cNn86.4-p.cNCr9.4-p.cNvDl.4-p.cNv7C.4-p.cNvAl.4-p.cNsB6.4-p.cNmlm.4-p.cNwmr.4-p.cNyo1.4-p.cNsBh.4-p.cN66e.4-p.cNymf.4-p.cN6ef.4-p.cNuro.4-p.cNgzx.4-p.cNs71.4-p.cNosB.4-p.cN6i2.4-p.cNqut.4-p.cNvDf.4-p.cNC10.4-p.cN1ez.4-p.cNkjy.4-p.cNznl.4-p.cNp1s.4-p.cNjtD.4-p.cN4m9.4-p.cN6lr.4-p.cNih4.4-p.cNCsh.4-p.cNg9B.4-p.cNpjk.4-p.cNlw3.4-p.cNe2i.4-p.cN41A.4-p.cNwko.4-p.cN7zq.4-p.cN4kh.4-p.cNkpv.4-p.cN4o1.4-p.cN4By.4-p.cN0p0.4-p.cNjpg.4-p.cN8m0.4-p.cNsv6.4-p.cN475.4-p.cN8k7.4-p.cN3zf.4-p.cN1n3.4-p.cNhAi.4-p.cNBfz.4-p.cNshi.4-p.cNnou.4-p.cNuzA.4-p.cN85f.4-p.cNsz0.4-p.cNws2.4-p.cNl5p.4-p.cN7n0.4-p.cNg6D.4-p.cN955.4-p.cNqkz.4-p.cNhm2.4-p.cNsCe.4-p.cN560.4-p.cN239.4-p.cN6zf.4-p.cNr65.4-p.cNCro.4-p.cNBAq.4-p.cNv3A.4-p.cNp32.4-p.cNo1u.4-p.cNk8k.4-p.cNfxr.4-p.cN0qg.4-p.cNzDw.4-p.cNAv7.4-p.cNzir.4-p.cNf4i.4-p.cN3yx.4-p.cNpyi.4-p.cNv8k.4-p.cNvCk.4-p.cNolv.4-p.cN45w.4-p.cNtvm.4-p.cN7mC.4-p.cNu99.4-p.cN815.4-p.cNxzi.4-p.cNu4j.4-p.cN2m8.4-p.cNkCq.4-p.cN9ot.4-p.cNDh8.4-p.cNj8i.4-p.cNvon.4-p.cNj44.4-p.cNAuD.4-p.cN9l9.4-p.cNtuq.4-p.cN3kr.4-p.cNt99.4-p.cNvC4.4-p.cNfgC.4-p.cNCjm.4-p.cN4jf.4-p.cN88v.4-p.cN5lg.4-p.cN44q.4-p.cNqwk.4-p.cNkyj.4-p.cN8yf.4-p.cNy70.4-p.cNv1z.4-p.cNhym.4-p.cN4sx.4-p.cN62x.4-p.cNDuz.4-p.cNppj.4-p.cNtDm.4-p.cNupg.4-p.cN79p.4-p.cNzf9.4-p.cNgox.4-p.cNz7k.4-p.cN19o.4-p.cN8nk.4-p.cNvuq.4-p.cNA6r.4-p.cNusm.4-p.cNl2e.4-p.cNqp3.4-p.cN2gC.4-p.cNg7s.4-p.cN6zm.4-p.cNhei.4-p.cNl81.4-p.cNmio.4-p.cNz8f.4-p.cN87C.4-p.cNC4f.4-p.cNqvn.4-p.cNitg.4-p.cNsCD.4-p.cN4w9.4-p.cN40u.4-p.cN4qk.4-p.cNABm.4-p.cNff3.4-p.cND1v.4-p.cNxg8.4-p.cNjx7.4-p.cNjf0.4-p.cNC8C.4-p.cNzp3.4-p.cN1iD.4-p.cN7it.4-p.cNp19.4-p.cN3rt.4-p.cN6A8.4-p.cN77s.4-p.cN38p.4-p.cNe7o.4-p.cNhj6.4-p.cN5lh.4-p.cNzqD.4-p.cN0i4.4-p.cNxuq.4-p.cNgCt.4-p.cNkrh.4-p.cNzmj.4-p.cNowg.4-p.cN4jk.4-p.cNmlD.4-p.cNirn.4-p.cNo8q.4-p.cNgmr.4-p.cNgus.4-p.cN4i5.4-p.cN2CD.4-p.cND8m.4-p.cNjsA.4-p.cNeyC.4-p.cNisB.4-p.cN4wB.4-p.cNfty.4-p.cNuek.4-p.cNB9i.4-p.cN390.4-p.cN1qA.4-p.cN022.4-p.cNzjo.4-p.cNiq3.4-p.cN1ww.4-p.cN8uj.4-p.cN51e.4-p.cNg4w.4-p.cNzfe.4-p.cNh0j.4-p.cNfw0.4-p.cNzD2.4-p.cNylg.4-p.cNp9f.4-p.cNm4l.4-p.cN7l6.4-p.cN01B.4-p.cNv4v.4-p.cNf5A.4-p.cNhkB.4-p.cNfsB.4-p.cNffA.4-p.cNujC.4-p.cNBi5.4-p.cN0yw.4-p.cN2i3.4-p.cNn3u.4-p.cNle6.4-p.cNDDx.4-p.cNo8u.4-p.cNghl.4-p.cNpo1.4-p.cNA1l.4-p.cNpr9.4-p.cNptw.4-p.cNhB5.4-p.cN4Dq.4-p.cNDet.4-p.cNogv.4-p.cNp7h.4-p.cN70y.4-p.cNzwr.4-p.cN37k.4-p.cNDgk.4-p.cNDyi.4-p.cNt1m.4-p.cNz7w.4-p.cNh78.4-p.cN