做过分布式事务开发的同学肯定都遇到过这个问题:TCC 模式下的空回滚和悬挂问题。简单来说就是:Try 方法还没执行,Cancel 方法就来了;或者 Try 执行失败,但 Cancel 还是被调用了。这些异常场景处理不好,会导致数据不一致。 我之前就遇到过这样一个案例:用户下单时库存扣减服务超时,TC(事务协调器)认为 Try 失败,触发 Cancel 回滚。但由于网络抖动,库存服务实际已经扣减成功了,只是响应超时。结果 Cancel 方法又执行了一次"回滚",把已经扣减的库存又加回去了,导致库存数据错误。 今天我们就来聊聊 TCC 空回滚与悬挂的处理方案,让你的分布式事务更加健壮。 TCC 模式基础回顾 1. TCC 三阶段流程 TCC(Try-Confirm-Cancel)模式: 阶段一:Try(预留资源) - 锁定相关资源 - 检查业务可行性 - 如果不可行,直接失败,不进入后续阶段 阶段二:Confirm(确认执行) - 真正执行业务操作 - 确认使用预留的资源 - 失败会不断重试,直到成功 阶段三:Cancel(取消回滚) - 释放预留的资源 - 回滚业务操作 - 失败也会不断....
为什么不推荐使用@Transactional声明事务?这些陷阱你必须知道
导语 在Spring项目开发中,@Transactional注解几乎是处理事务的标准配置。它简单易用,一行代码就能搞定事务管理,深受开发者喜爱。但你知道吗?在某些场景下,@Transactional可能会成为性能瓶颈或导致难以排查的bug。今天,我们就来深入探讨为什么在某些情况下不推荐使用@Transactional声明事务,以及如何避免这些陷阱。 一、@Transactional的甜蜜陷阱 1.1 看起来很美好 @Service public class OrderService { @Autowired private OrderRepository orderRepository; @Transactional public void createOrder(Order order) { orderRepository.save(order); // 其他业务逻辑 } } 这段代码看起来很简洁,@Transactional注解自动处理了事务的开始、提交和回滚。但在实际项目中,这种简单的配置可能隐藏着巨大的风险。 1.2 常见陷阱 1. 自调用问题 这是最常见的陷阱之一。当在同....
Redis事务又被回滚了?这5个核心原理让你彻底搞懂分布式事务!
Redis事务又被回滚了?这5个核心原理让你彻底搞懂分布式事务! 本文来自公众号【服务端技术精选】,专注Java后端技术干货分享 大家好,欢迎来到【服务端技术精选】!我是你们的老朋友,一个在后端踩过无数坑的程序员。 今天我们要聊的话题是Redis事务。相信很多小伙伴在使用Redis时都遇到过这样的困惑:明明觉得Redis的事务和MySQL事务差不多,但实际使用时却发现各种"不对劲"的地方。比如: Redis事务执行一半出错了,为什么不会回滚? 为什么Redis事务里某个命令执行失败了,后面的命令还会继续执行? Redis事务真的能保证数据一致性吗? 如果你也有这些疑问,那今天这篇文章就是为你准备的!我会用最通俗易懂的方式,带你彻底搞懂Redis事务的那些事儿。 在开始之前,先给大家透露一下,Redis事务和我们熟悉的MySQL事务可不太一样,它更像是一个"打包执行"的功能,而不是真正的ACID事务。这也就是为什么很多人会踩坑的原因。 废话不多说,让我们直接进入正题! Redis事务基础概念和原理 什么是Redis事务? 首先,我们要明确一个概念:Redis事务和传统关系型数据库....
