Tcc下的幂等性笔记

本文介绍了Seata分布式事务框架在Tcc模式下如何通过幂等性工具类来防止SQL重复提交的问题。文章详细分析了在事务正常成功、本地事务失败和本地事务成功但全局事务失败三种情况下,幂等性是如何保证的,特别是在本地事务成功后的标记检查和删除机制,以确保重复提交或回滚时的幂等性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Seata作为广泛使用的分布式事务框架,在Tcc模式下存在sql重复提交的可能,在这里记录下个人感觉好使的一个简单地保证幂等性的工具类及使用方法.
这篇文章仅做个人笔记,有点乱 = =

1.背景

下面是Seata的Tcc模式的事务接口以及实现类.

1.1order接口

@LocalTCC
public interface OrderTccAction {
   
    /*
    第一阶段的方法
    通过注解指定第二阶段的两个方法名

    BusinessActionContext 上下文对象,用来在两个阶段之间传递数据
    @BusinessActionContextParameter 注解的参数数据会被存入 BusinessActionContext
     */
    @TwoPhaseBusinessAction(name = "orderTccAction",commitMethod = "commit",rollbackMethod = "rollback")
    boolean prepareCreateOrder(BusinessActionContext businessActionContext,
                               @BusinessActionContextParameter(paramName = "orderId") Long orderId,
                               @BusinessActionContextParameter(paramName = "userId") Long userId,
                               @BusinessActionContextParameter(paramName = "productId") Long productId,
                               @BusinessActionContextParameter(paramName = "count") Integer count,
                               @BusinessActionContextParameter(paramName = "money") BigDecimal money
    );
    // 第二阶段 - 提交
    boolean commit(BusinessActionContext businessActionContext);

    // 第二阶段 - 回滚
    boolean rollback(BusinessActionContext businessActionContext);
}

1.2order接口实现类

@Component
@Slf4j
public class OrderTccActionImpl implements OrderTccAction {
   
    @Autowired
    private OrderMapper orderMapper;
    @Transactional
    @Override
    public boolean prepareCreateOrder(BusinessActionCont
### 幂等性处理方法及其实现 #### 使用唯一标识符防止重复提交 为了确保请求不会被多次执行,可以在每次发起请求时生成唯一的标识符并存储于数据库或其他持久化介质中。当接收到新的请求时,先检查该唯一标识符是否存在;如果存在,则说明此请求已经被处理过,应返回之前的结果而不是再次执行业务逻辑[^1]。 #### 设计幂等的操作函数 某些特定类型的API调用天然具备幂等特性,比如GET查询类接口通常被认为是幂等的因为它们只读取资源而不改变其状态。然而对于那些可能影响系统内部状态的服务端点来说,开发者需要精心设计以确保这些操作即使被执行多遍也不会造成副作用。这可以通过调整算法使得相同输入总是得到一致输出来达成。 #### 利用分布式事务保障一致性 在复杂的分布式环境中,通过引入全局性的协调机制如TCC(Try-Confirm-Cancel)两阶段提交协议或者Saga模式下的长活事务管理器可以帮助维持跨多个服务之间的数据同步以及幂等性质。这类方案往往涉及到了较为高级别的架构层面考量,并且可能会带来额外性能开销因此需谨慎评估适用场景后再做决策。 ```java // Java代码片段展示如何基于Redis缓存实现简单的幂等控制 public boolean processRequest(String requestId, Runnable task){ Jedis jedis = new Jedis("localhost"); String lockKey = "lock:" +requestId; try{ // 尝试设置锁,NX表示不存在才创建,EX指定超时期限秒数 Long result = jedis.setnx(lockKey,"locked"); if(result != null && result == 1L){ // 成功获取到锁,允许继续向下执行具体任务 task.run(); // 清除标记位以便后续同名请求能够正常进入 jedis.del(lockKey); return true; }else{ System.out.println("Duplicate request detected!"); return false; } }finally { jedis.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值