Tcc-transaction dubbo 分布式事务

需求: Dubbo 如何做分布式事务?? 除了fescar 那么高深的框架,今天来学习一下 tcc-transaction, github 上的star 有3000多个(https://github.com/changmingxie/tcc-transaction.git)。

介绍:

(1). tcc 指的是 try, cancel, confirm, 在 tcc-transaction 的源码中, cancel 和confirm 没有做幂等性控制,?需要程序员手动的保证他们的幂等性。?

(2). tcc-transaction 主要是通过补偿性的措施来保证分布式事务的。通过注解Compensable, 指定confirmMethod 和?cancelMethod 的名字。

(3). tcc-transaction 对dubbo 的支持,是通过重新 扩展 proxyFactory 的 spi,实现了Tccjavassist 和 tccjdk 方式来重新生成带有?Compensable 注解的 代理类。 原声的dubbo proxyFactory 是不能够生成带有?Compensable 注解的 代理类的。

(4).tcc-transaction 主要是通过spring 的 AOP 中 通知环绕的方式,来处理?Compensable 注解。

(5) 源代码中?CompensableTransactionAspect (先执行)和?ResourceCoordinatorInterceptor (后执行) 是两个 切面,执行的顺序依靠 spring core 中的 order 的大小, 越小 执行的顺序越是提前,CompensableTransactionAspect 的执行 order 是?Ordered.HIGHEST_PRECEDENCE。

(6) 通过AOP的环绕通知,我们知道 类 中CompensableTransactionInterceptor 调用?pjp.proceed() 不会执行 目标 method, 反而会执行?ResourceCoordinatorInterceptor 中的?interceptTransactionContextMethod方法,ResourceCoordinatorInterceptor 中的?pjp.proceed(pjp.getArgs())方法,才会调用执行目标方法。

好了, 首先得弄清楚tcc-transaction 给我们提供的案例,大家先倒入sql,比较全的那个sql 文档,含有is_deleted 字段,然后用tomcat 启动是完全可以执行的,同时我尝试的springboot start dubbo 版本也会放到github 上的,大家可以尝试用我的案例 结合springboot dubbo 应用去更好的解决分布式事务问题。

(7)个人觉得 tcc-transaction 没有很好实现分布式事务,源代码简单,虽然经过大量的本地测试,源码里面有些情况不知道干什么用,比如?PROVIDER 类型 和?CONSUMER 类型的methodType, 因此个人仅仅当作了解, 不可生产环境使用,但是dubbo proxy 的封装可以学习下,待以后封装时候使用。

(8)个人觉得?fescar 的模型层次更分明,Transaction coordinator ,维护 全局和分支的事务,驱动全局事务的commit 或者 callback 。Transaction Manager, 决定何时开始全局事务,commit 或者 callback 全局事务。Resource Manager, 管理分支上的事务,并将分支事务执行状态报告给?Transaction coordinator?

好了,咱们去看看tcc-transaction 的源码逻辑?

CompensableTransactionAspect:

首先会加载tcc-transation-srping 里面?tcc-transaction.xml, 加载好相关的bean 之后,会调用到CompensableTransactionAspect 的interceptCompensableMethod方法,当我们进入方法之后,发现下面的

TransactionContext transactionContext = FactoryBuilder.factoryOf(compensable.transactionContextEditor()).getInstance().get(pjp.getTarget(), method, pjp.getArgs());

dubbo 的transactionContext 是由 dubbo 的 RpcContext来设置,dubbo RpcContext 是由 threadlocal 原理来实现的。然后再判断是不是合法的t rantransactionConext. 计算methodType 的逻辑有点不太明白作者的思路,因为没有注释,其中经过测试 method type 是root 的表明是 一个事务的根事务,会开启一个全局的事务,?PROVIDER 字面上的意思是服务的提供方,之前全局的事务已经开启了。然后再去判断 try, confirm 和 cancel 状态。

MethodType methodType =CompensableMethodUtils.calculateMethodType(propagation, isTransactionActive, transactionContext);

然后执行?returnValue = pjp.proceed();??

ResourceCoordinatorInterceptor,

?我们看?interceptTransactionContextMethod方法,首先是获取 CompensableTransactionAspect 创建的事务, 如果事务是trying 的状态,就会通过?enlistParticipant 方法,将要执行的?Participant 加入到?transactionManager 中, 以待后面执行。 return pjp.proceed(pjp.getArgs()); 才会执行真正的方法体,任务的异常报错,都会执行?CompensableTransactionInterceptor 的?rootMethodProceed,?transactionManager.rollback(asyncCancel); 将会执行cancel 方法。 此时cancel 方法必须是幂等的而且必须能够回滚之前的操作,这种会对程序员要求很高。?

如果没有异常发生,就会执行?transactionManager.commit(asyncConfirm);,将事务commit 提交,执行confirm 方法,try 方法是方法体,预留资源, confirm 将预留资源 进行确认操作, cancel 就是将预留资源回滚。

DefaultRecoverConfig

这个方法没有看,但是拍脑袋想应该是当事务执行失败时候,进行不断的尝试,因为我觉得生产线上不会使用这个来做尝试机制,还需自己设计

总体感觉没有注释, 没有文档,此外逻辑比较简单,我觉得不适合做dubbo 的分布式事务。

测试代码见下面的github:?https://github.com/dongdongqin/tcc-transaction-demo.git? ??

consumer 那端自己照样子写就好,很简单。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容