Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

    • 理论等

      • 分布式锁
      • 从道法术器层面看分布式锁
      • 基于数据库的分布式锁
      • 基于Redis的分布式锁
      • 基于ZooKeeper的分布式锁
      • 从道法术器层面看分布式事务
      • 调用第三方怎么保证事务的四个特性
      • 最终一致和强一致性的区别
      • 本系统扣库存生成计费单,向第三方系统推送计费单,这两个场景分别用什么一致性
      • 单体改微服务,除了分布式锁,除了分布式事务,还要注意哪些问题
    • 分布式算法

    • 分布式事务

    • 分布式锁

    • SpringCloud

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • 分布式
  • 理论等
plantre
2025-05-13

调用第三方怎么保证事务的四个特性

在调用第三方系统时保证事务的ACID(原子性、一致性、隔离性、持久性)特性需要结合柔性事务设计、分布式协议和安全机制。以下是具体策略与技术实现:


一、原子性(Atomicity)的保障 1. 两阶段提交(2PC) • 实现方式:

协调者(Coordinator)分两阶段管理事务:
• 准备阶段:向所有参与者(包括第三方系统)发送预提交请求,参与者锁定资源并返回准备状态。

• 提交阶段:若所有参与者确认就绪,协调者发送提交指令;否则发送回滚指令。

• 适用场景:对强一致性要求高的金融交易(如跨系统转账)。

• 局限性:存在单点故障风险,且长时间锁资源可能引发性能瓶颈。

2. TCC模式(Try-Confirm-Cancel) • 核心步骤:

• Try:调用第三方接口预扣资源(如冻结库存),记录操作日志。

• Confirm:主事务成功则确认资源占用(如实际扣减库存)。

• Cancel:主事务失败则调用补偿接口释放资源(如解冻库存)。

• 代码示例(参考网页5的补偿逻辑):

// Try阶段:调用第三方接口预留资源
boolean tryResult = thirdPartyService.tryReserve(resourceId);
if (!tryResult) throw new Exception("预留失败");

// Confirm/Cancel阶段(需幂等性设计)
if (mainTransactionSuccess) {
    thirdPartyService.confirmReserve(resourceId);
} else {
    thirdPartyService.cancelReserve(resourceId);
}
1
2
3
4
5
6
7
8
9
10

二、一致性(Consistency)的维护 1. Saga模式 • 实现原理:将长事务拆分为多个本地事务,通过事件驱动异步执行:

• 正向操作:每个子事务执行后发布事件,触发后续操作。

• 补偿操作:任一子事务失败时,触发已成功事务的逆向补偿。

• 适用场景:电商订单创建(涉及订单服务、库存服务、支付服务)。

• 工具支持:使用消息队列(如Kafka)确保事件可靠传递。

2. 最终一致性 • 实现方式:

• 调用第三方接口后记录操作日志,通过定时任务或消息队列异步校对数据状态。

• 若发现不一致,触发补偿或告警机制。

• 示例:支付成功后异步通知订单系统更新状态,若通知失败则定时重试。


三、隔离性(Isolation)的控制 1. 乐观锁机制 • 实现方法:

• 调用第三方接口时携带版本号或时间戳。

• 第三方系统校验数据版本,若冲突则拒绝操作并返回错误码。

• 代码示例(参考网页5的版本控制逻辑):

// 请求参数中携带版本号
Map<String, Object> params = new HashMap<>();
params.put("data", orderData);
params.put("version", currentVersion);

// 第三方系统校验版本
if (requestVersion != dbVersion) {
    throw new ConflictException("数据版本冲突");
}
1
2
3
4
5
6
7
8
9

2. 分布式锁 • 实现方式:

• 使用Redis或ZooKeeper对关键资源(如用户账户)加锁,确保同一时间只有一个事务可修改。

• 锁超时机制避免死锁(如Redisson的lock.lock(10, TimeUnit.SECONDS))。


四、持久性(Durability)的保证 1. 事务日志与冗余存储 • 本地日志:记录所有第三方调用请求及响应,用于故障恢复。

• 异地备份:将日志同步至分布式存储(如HDFS)或云存储(如AWS S3)。

2. 异步重试与幂等性 • 幂等设计:第三方接口需支持唯一请求ID,避免重复提交(如网页4的nonce随机数机制)。

• 重试策略:

// 使用指数退避策略重试(参考网页5)
RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.execute(context -> {
    thirdPartyService.callApi();
    return null;
});
1
2
3
4
5
6

五、安全与稳定性增强 1. 接口认证与加密 • 认证机制:

• 使用API密钥对(AK/SK)生成签名(如HMAC-SHA256),防止篡改。

• 短期令牌(如OAuth2的access_token)替代长期密钥。

• 传输加密:强制HTTPS协议,敏感数据额外加密(如AES)。

2. 熔断与降级 • 熔断器模式:通过Hystrix或Resilience4j监控第三方接口可用性,故障时快速失败。

• 降级策略:主流程失败时返回缓存数据或友好提示(如“服务繁忙,请稍后重试”)。


总结 调用第三方系统时,需根据业务场景选择事务模型:
• 强一致性场景:优先使用2PC或TCC模式,牺牲部分性能换取数据强一致。

• 高并发最终一致场景:采用Saga+消息队列,通过异步和补偿实现最终一致。

• 安全与幂等:结合API签名、唯一请求ID和重试机制,确保操作可靠。

通过以上策略,可在分布式环境下最大程度满足ACID特性,同时平衡性能与复杂度。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
从道法术器层面看分布式事务
最终一致和强一致性的区别

← 从道法术器层面看分布式事务 最终一致和强一致性的区别→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式