当前位置: 首页 > news >正文

分布式事务-TCC

分布式事务TCC是一种补偿式的分布式事务解决方案,旨在保证在分布式系统中,跨多个服务或资源的事务能够保持一致性和可靠性。

一、TCC概述

TCC,全称Try-Confirm-Cancel,是一种用于处理分布式事务的协议。其核心思想是通过在业务逻辑中嵌入三个阶段(Try、Confirm、Cancel)的操作,来确保在分布式事务中,各个参与者能够协同工作,实现事务的原子性。TCC协议本身不保证事务隔离性,一阶段执行完成就提交本地事务,需要业务模型实现时解决事务隔离性问题。

二、TCC运行流程

  1. Try阶段

    • 业务逻辑会预留资源,并检查所有的前提条件是否满足。

    • 如果检查通过,则执行业务逻辑,进入Confirm阶段;否则,回滚预留的资源,进入Cancel阶段。

  2. Confirm阶段

    • 在这个阶段,业务逻辑会确认执行结果。

    • 如果确认通过,则提交所有的操作,完成事务;否则,回滚所有的操作,进入Cancel阶段。

  3. Cancel阶段

    • 如果在Try或Confirm阶段出现错误或异常,业务逻辑会撤销之前执行的操作,并释放之前预留的资源。

三、TCC实现流程

1. 定义TCC接口

首先,需要定义TCC操作的接口,通常包括三个方法:tryconfirmcancel

  • try 方法:尝试执行业务操作,并预留必要的资源。如果成功,则返回一个全局唯一的事务ID(通常称为XID)和表示操作是否成功的结果。

  • confirm 方法:确认try阶段成功提交的操作。它应该是一个幂等操作,即使多次调用也应该产生相同的结果。

  • cancel 方法:取消try阶段预留的资源,并回滚可能的业务操作。同样,它也应该是一个幂等操作。

2. 实现TCC业务逻辑

业务代码中,需要实现上述三个方法的具体逻辑。

  • try 方法中,需要执行实际的业务操作,并预留资源。这可能包括数据库记录的锁定、外部服务的调用等。如果所有操作都成功,则返回成功结果和XID;否则,返回失败结果并可能触发cancel操作。

  • confirm 方法中,需要根据XID确认并提交try阶段的操作。。

  • cancel 方法中,需要根据XID取消并回滚try阶段预留的资源。

3. 管理事务状态

需要实现事务协调器,可以通过将事务状态存储在数据库、缓存或分布式系统中来实现。事务状态可以包括:TRYING(正在尝试)、CONFIRMED(已确认)、CANCELED(已取消)等。

4. 调用TCC接口

业务流程中,当需要执行分布式事务时,需要按照以下步骤调用TCC接口:

  1. 调用try方法执行业务操作并预留资源。

  2. 根据try方法的返回结果决定是否调用confirmcancel方法。

  3. 如果try方法成功,则调用confirm方法提交事务;否则,调用cancel方法回滚事务。

5. 异常处理和重试

在分布式系统中,网络分区、服务故障等异常情况是不可避免的。因此,需要实现异常处理和重试机制来确保TCC事务的可靠性。

  • 对于try方法,如果发生异常,可以根据具体情况选择是否重试或调用cancel方法。

  • 对于confirmcancel方法,由于它们是幂等操作,因此可以安全地重试,直到它们成功为止。

6.注意事项
  • 幂等性confirmcancel方法必须是幂等的,以确保多次调用不会产生副作用。

  • 事务隔离性:在try阶段,需要确保对资源的访问是隔离的,以避免并发冲突,即通过资源预留的方式解决事务隔离性问题。

  • 超时处理:为tryconfirmcancel操作设置合理的超时时间,并在超时时采取相应的措施(如重试、回滚等)。

  • 错误处理:为可能出现的各种错误和异常情况设计合理的错误处理策略。

四、TCC的优缺点

优点

  1. 灵活性:TCC允许在业务逻辑中自定义补偿操作,可以根据具体业务场景进行灵活配置。

  2. 支持分布式事务:TCC可以支持跨多个服务或资源的分布式事务,保证事务的一致性和可靠性。

  3. 减少阻塞时间:Try阶段可以预留资源,从而减少了阻塞时间,提高了并发能力,从而提升性能。

缺点

  1. 应用侵入性强:TCC需要在业务逻辑中嵌入Try-Confirm-Cancel三个阶段的逻辑,对于现有系统的改造成本较高。

  2. 开发难度大:代码开发量较大,需要保证confirm和cancel接口的幂等性,增加了开发的复杂度。

五、总结

TCC作为一种补偿式的分布式事务解决方案,在分布式系统中具有重要的作用。它通过在业务逻辑中嵌入Try-Confirm-Cancel三个阶段的逻辑,来保证分布式事务的一致性和可靠性。然而,TCC也存在一些缺点,如应用侵入性强、开发难度大等。因此,在选择分布式事务解决方案时,需要根据具体业务场景和需求进行权衡和选择。

相关文章:

  • 锐捷网络与您相约第七届数字中国建设峰会 共话数字未来
  • RestTemplet 自定义消息转换器总结
  • 香港Web3媒体:Techub News
  • 动手学深度学习(Pytorch版)代码实践-深度学习基础-01基础函数的使用
  • 价值飙升30%,AI PC拉动半导体出货潮
  • 今日好料推荐(大数据湖体系规划)
  • Codeforces Round 947 (Div. 1 + Div. 2) D. Paint the Tree 题解 DFS
  • 轧钢测径仪分析软件,四大图表带来产线新视角!
  • 云下到云上,丽迅物流如何实现数据库降本50% | OceanBase案例
  • 数字营销:以大数据作引擎,推动企业全面数字化升级
  • FFmpeg编解码的那些事(2)
  • 包和final
  • HaloDB 的 Oracle 兼容模式
  • 一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题
  • 解决vue版本不一致导致不能正常编译
  • Consul Config 使用Git做版本控制的实现
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • input的行数自动增减
  • React-生命周期杂记
  • 测试如何在敏捷团队中工作?
  • 从setTimeout-setInterval看JS线程
  • 代理模式
  • 理清楚Vue的结构
  • 责任链模式的两种实现
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 组复制官方翻译九、Group Replication Technical Details
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #mysql 8.0 踩坑日记
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.13) SiK无线电高级配置(六)
  • (11)MATLAB PCA+SVM 人脸识别
  • (PADS学习)第二章:原理图绘制 第一部分
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)插入排序
  • (转)visual stdio 书签功能介绍
  • (转)程序员疫苗:代码注入
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET程序员迈向卓越的必由之路
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C++] 模拟实现list(二)