1. 概述

本文分享 TCC 实现。主要涉及如下三个 Maven 项目:

  • tcc-transaction-core :tcc-transaction 底层实现。
  • tcc-transaction-api :tcc-transaction 使用 API。
  • tcc-transaction-spring :tcc-transaction Spring 支持。

你行好事会因为得到赞赏而愉悦同理,开源项目贡献者会因为 Star 而更加有动力为 TCC-Transaction 点赞!传送门

OK,开始我们的第一段 TCC 旅程吧。

ps:笔者假设你已经阅读过《tcc-transaction 官方文档 —— 使用指南1.2.x》。

ps2:未特殊说明的情况下,本文事务指的是 TCC事务

2. TCC 原理

TCC事务为了解决在事务运行过程中大颗粒度资源锁定的问题,业界提出一种新的事务模型,它是基于业务层面的事务定义。锁粒度完全由业务自己控制。它本质是一种补偿的思路。它把事务运行过程分成 Try、Confirm / Cancel 两个阶段。在每个阶段的逻辑由业务代码控制。这样就事务的锁粒度可以完全自由控制。业务可以在牺牲隔离性的情况下,获取更高的性能。

  • Try 阶段
  • 完成所有业务检查( 一致性 )
  • 预留必须业务资源( 准隔离性 )
  • Try :尝试执行业务
  • Confirm / Cancel 阶段:
  • 释放 Try 阶段预留的业务资源
  • Cancel 操作满足幂等性
  • 真正执行业务
  • 不做任务业务检查
  • Confirm 操作满足幂等性
  • Confirm :确认执行业务
  • Cancel :取消执行业务
  • Confirm 与 Cancel 互斥

整体流程如下图:

  • 红框部分功能由 tcc-transaction-core 实现:
  • 启动业务活动
  • 登记业务操作
  • 提交 / 回滚业务活动
  • 黄框部分功能由 tcc-transaction-http-sample 实现( 官方提供的示例项目 ):
  • Try 操作
  • Confirm 操作
  • Cancel 操作

与 2PC协议 比较

  • 位于业务服务层而非自愿层
  • 没有单独的准备( Prepare )阶段,Try 操作兼备自愿操作与准备能力
  • Try 操作可以灵活选择业务资源的锁定粒度
  • 较高开发成本

参考资料:

  • 《支付宝运营架构中柔性事务指的是什么?》
  • 《分布式事务的典型处理方式:2PC、TCC、异步确保和最大努力型》

3. TCC-Transaction 原理

在 TCC 里,一个业务活动可以有多个事务,每个业务操作归属于不同的事务,即一个事务可以包含多个业务操作。TCC-Transaction 将每个业务操作抽象成事务参与者,每个事务可以包含多个参与者

参与者需要声明 try / confirm / cancel 三个类型的方法,和 TCC 的操作一一对应。在程序里,通过 @Compensable 注解标记在 try 方法上,并填写对应的 confirm / cancel 方法,示例代码如下:

// try

@Compensable(confirmMethod = "confirmRecord

@transaction 提交事务_分布式事务 TCC-Transaction 源码分析——TCC 实现相关推荐

  1. 阿里开源一站式分布式事务框架seata源码分析(AT模式下TM与RM分析)

    序言: 对于阿里开源分布式事务框架seata的详细了解可以参考官网,这里不会详细介绍.本章只会介绍seata中AT模式的源码分析(对阿seata有一定了解或者成功完成过demo). seata中一个事 ...

  2. @Transactional的用法详解及Transactional事务无效的源码分析

    数据库事务正确执行的四要素 1.原子性 事务是不可分割的最小的工作单元,事务内的操作要么全做,要么全不做,不能只做一部分. 2.一致性 事务执行前数据库的数据按照逻辑处于正确的状态,事务执行后数据库的 ...

  3. springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起

    春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...

  4. mybatis第十话 - mybaits整个事务流程的源码分析

    1.故事前因 在分析mybatis源码时一直带的疑问,一直以为事务是在SqlSessionTemplate#SqlSessionInterceptor#invoke完成的,直到断点才发现并不简单! 在 ...

  5. 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现

    死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...

  6. java直接内存为什么快_直接内存与 JVM 源码分析

    直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...

  7. 蚂蚁金服分布式事务框架DTX源码学习

    文章目录 一.前言 二.DTX简介 三.角色 四.服务发起者与参与者DTX客户端启动流程 1.项目启动,创建dtx动态代理 2.初始化DtxClient客户端的init()方法 五.服务发起以及参与流 ...

  8. redis watchdog_Redis分布式事务框架Redisson源码解析(一)

    代码片段一. public static void main(String[] args) throws Exception { Config config = new Config(); confi ...

  9. 我的世界java刷怪数量_我的世界Minecraft源码分析(1):刷怪逻辑

    这个系列通过对我的世界Minecraft源码进行拆分讲解,让大家可以清除的了解一款游戏是怎么一步步被实现出来的,下面就介绍Minecraft源码第一篇内容,关于刷怪逻辑. 生成循环 生物大致划分为四种 ...

最新文章

  1. python ai应用开发_AI应用开发实战 - 从零开始搭建macOS开发环境
  2. 佳明245接收微信消息
  3. 如何判断Socket连接失效
  4. Java script生成apk_lua脚本实现自动生成APK包
  5. python怎么读取石墨表格_每2秒进行一次statsd xaxis石墨统计 - python
  6. 【高并发】——幂等的实现方案
  7. Java_Date_01_判断两个时间相差的天数
  8. Java我的世界forge安装失败,我的世界forge安装失败install怎么办
  9. 利用python做淘宝_利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程...
  10. Flutter - 微信朋友圈效果实现
  11. gels imagej 图片处理_科研论文作图之ImageJ
  12. 三、亚马逊产品定价其实就这么简单,一个公式解决
  13. UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample
  14. 修改照片为社保照片 358*441
  15. 解决git 中 error 10053 问题
  16. python3处理excel
  17. AnySim一键解锁教程nbsp;只适用于新iPhone
  18. 智能家居解决方案-HouseKeeperV1.0 [管家V1]
  19. 建筑学计算机交叉学科BIM,BIM有区分专业吗
  20. tp管理界面找不到服务器,TP-LINK路由器无法登陆管理界面的解决办法

热门文章

  1. npm缺少css-loader,/style-compiler,stylus-loader问题,npm没有权限无法全局更新问题【已解决】
  2. IntelliJ IDEA2018配置SVN及常见问题解决
  3. HttpClient 大量连接等待异常的处理
  4. Thinkphp5.1允许uni-app的H5跨域请求接口解决方法
  5. 从终端运行React Native App时出错(iOS)
  6. 如何在Python中声明一个数组?
  7. 《敏捷软件开发》第二章极限编程实践
  8. 三分钟学会css3中的flexbox布局
  9. bootstrap搜索框样式代码及效果
  10. YYCache 源码分析(一)