@transaction 提交事务_分布式事务 TCC-Transaction 源码分析——TCC 实现
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 实现相关推荐
- 阿里开源一站式分布式事务框架seata源码分析(AT模式下TM与RM分析)
序言: 对于阿里开源分布式事务框架seata的详细了解可以参考官网,这里不会详细介绍.本章只会介绍seata中AT模式的源码分析(对阿seata有一定了解或者成功完成过demo). seata中一个事 ...
- @Transactional的用法详解及Transactional事务无效的源码分析
数据库事务正确执行的四要素 1.原子性 事务是不可分割的最小的工作单元,事务内的操作要么全做,要么全不做,不能只做一部分. 2.一致性 事务执行前数据库的数据按照逻辑处于正确的状态,事务执行后数据库的 ...
- springboot 手动提交事务_分布式事务开局第一篇,从数据库事务隔离级别说起
春节临近,松哥也有点无心撸码.不过很多时候,很多事情,我们不能由着自己的性子,还是要控制一下自己,这不,松哥最近又打算开一个坑,和大家聊一聊分布式事务,因为我们做微服务,分布式事务肯定是跳不过去的坎. ...
- mybatis第十话 - mybaits整个事务流程的源码分析
1.故事前因 在分析mybatis源码时一直带的疑问,一直以为事务是在SqlSessionTemplate#SqlSessionInterceptor#invoke完成的,直到断点才发现并不简单! 在 ...
- 3 v4 中心节点固定_死磕以太坊源码分析之p2p节点发现
死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以 ...
- java直接内存为什么快_直接内存与 JVM 源码分析
直接内存(堆外内存) 直接内存有一种叫法,堆外内存. 直接内存(堆外内存)指的是 Java 应用程序通过直接方式从操作系统中申请的内存.这个差别与之前的堆.栈.方法区,那些内存都是经过了虚拟化.所以严 ...
- 蚂蚁金服分布式事务框架DTX源码学习
文章目录 一.前言 二.DTX简介 三.角色 四.服务发起者与参与者DTX客户端启动流程 1.项目启动,创建dtx动态代理 2.初始化DtxClient客户端的init()方法 五.服务发起以及参与流 ...
- redis watchdog_Redis分布式事务框架Redisson源码解析(一)
代码片段一. public static void main(String[] args) throws Exception { Config config = new Config(); confi ...
- 我的世界java刷怪数量_我的世界Minecraft源码分析(1):刷怪逻辑
这个系列通过对我的世界Minecraft源码进行拆分讲解,让大家可以清除的了解一款游戏是怎么一步步被实现出来的,下面就介绍Minecraft源码第一篇内容,关于刷怪逻辑. 生成循环 生物大致划分为四种 ...
最新文章
- python ai应用开发_AI应用开发实战 - 从零开始搭建macOS开发环境
- 佳明245接收微信消息
- 如何判断Socket连接失效
- Java script生成apk_lua脚本实现自动生成APK包
- python怎么读取石墨表格_每2秒进行一次statsd xaxis石墨统计 - python
- 【高并发】——幂等的实现方案
- Java_Date_01_判断两个时间相差的天数
- Java我的世界forge安装失败,我的世界forge安装失败install怎么办
- 利用python做淘宝_利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程...
- Flutter - 微信朋友圈效果实现
- gels imagej 图片处理_科研论文作图之ImageJ
- 三、亚马逊产品定价其实就这么简单,一个公式解决
- UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample
- 修改照片为社保照片 358*441
- 解决git 中 error 10053 问题
- python3处理excel
- AnySim一键解锁教程nbsp;只适用于新iPhone
- 智能家居解决方案-HouseKeeperV1.0 [管家V1]
- 建筑学计算机交叉学科BIM,BIM有区分专业吗
- tp管理界面找不到服务器,TP-LINK路由器无法登陆管理界面的解决办法