打开网易新闻 查看精彩图片
用过Spring Boot的人,基本都写过@Transactional。但真被坑过的才知道,propagation那几行配置不是摆设——是埋雷。
REQUIRED、REQUIRES_NEW、NESTED,面试能背,生产环境翻车。最常见的情况:方法A加了事务,调用方法B,B想新开事务独立提交,结果配置写错,B的异常把A也拖下水。回滚范围一扩,数据对不上,排查到凌晨。
区别藏在细节里。REQUIRED是默认项,有事务就蹭,没有就新建——看似省心,实际把多个操作捆成一锅粥。REQUIRES_NEW是真·新开,挂起当前事务,自己玩自己的,提交失败也不连累上游。NESTED更微妙,搞出个嵌套回滚点,像游戏存档,部分失败可以读档重来,但底层依赖数据库savepoint,不支持就降级成REQUIRED。
Spring文档其实警告过:「NESTED requires a SavepointManager, which is not supported by all transaction managers.」翻译成人话——你用MySQL没问题,换某些数据源直接失效,静默降级,等你发现的时候账已经乱了。
很多团队的做法是统一REQUIRES_NEW保平安,代价是连接池压力翻倍。没有银弹,只有场景。调传播行为之前,先画清楚调用链——哪些必须同生共死,哪些得隔离保命。
有个细节:Spring 6.1之后,事务日志级别从DEBUG调到TRACE,默认不打印。出问题想抓现场?先改配置,否则日志里干干净净,像什么都没发生。
热门跟贴