菜包大话-分布式事务-补偿事务-TCC

栏目: 后端 · 发布时间: 5年前

内容简介:大家好,我是培训时长N年半的培训生,菜..菜包。喜欢 ..xx..xx..xx..篮球。长时间培训,感觉需要写点东西,欢迎指正、交流。

大家好,我是培训时长N年半的培训生,菜..菜包。

喜欢 ..xx..xx..xx..篮球。

长时间培训,感觉需要写点东西,欢迎指正、交流。

概述

TCC是一种补偿型的事务,其核心思想是:对于每个操作,都要注册一个与其对应的确认和补偿(撤销)的操作。

TCC是一种应用层的、手动补偿的补偿型事务。

运行过程

  • Try 阶段主要是对业务系统做检测和资源预留。
  • Confirm 阶段主要是对业务系统做确认提交,Try 阶段执行成功并开始执行 Confirm 阶段时,默认 Confirm 阶段时不会出错的。即:只要 Try 成功,Confirm 一定成功;若Confirm失败,则一直重试直至成功。
  • Cancel 阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源的释放。

例子

隔壁老王给儿子转账,老王是农行的卡,儿子是工行的卡。

假设老王当前卡里有10000块,想转给儿子3000块,儿子目前卡里有2000块。

TCC理想成功情况下

  1. 农行检查老王账户状态,再将老王卡里的10000块扣减3000块,剩下7000块,往老王的预转出账户里增加3000块。(Try)
  2. 工行检查儿子账户状态,再将儿子的预转入账户里增加3000块。(Try)
  3. 以上步骤全部成功,农行将老王的预转出账户减少3000块,工行将儿子的预转入账户减少3000块,同时儿子的卡里增加3000块。(Confirm)
class Transfer{
	String transfer(){
		//农行预转出
		nonghang.tryReduce(3000);
		//工行预转入
		gonghang.tryAdd(3000);
		//农行确认转出
		nonghang.confirmReduce(3000);
		//工行确认转入
		gonghang.confirmAdd(3000);
		return "success";
	}
}
复制代码

TCC失败情况 -- Try阶段失败

  1. 农行检查老王账户状态,再将老王卡里的10000块扣减3000块,剩下7000块,往老王的预转出账户里增加3000块。(Try)
  2. 工行检查儿子账户状态,发现儿子账户存在问题,转入金额失败。(Try)
  3. 儿子工行卡Try阶段失败,那么老王农行卡需要减去预扣减账户里的3000块,往卡里增加3000块。(Cancel)
  4. 若第3步Cancel失败,则需要重试。
class Transfer{
	String transfer(){
		//农行预转出
		boolean nhTrySuccess = nonghang.tryReduce(3000);
		if (!nhTrySuccess) {
			return "fail";
		}
		//工行预转入
		boolean ghTrySuccess = gonghang.tryAdd(3000);;
		if (!ghTrySuccess) {
			boolean nhCancelSuccess = false;
			while(!nhCancelSuccess){
				//农行取消转出
				nhCancelSuccess = nonghang.cancelReduce(3000);
			}
			return "fail";
		}
		//农行确认转出
		nonghang.confirmReduce(3000);
		//工行确认转入
		gonghang.confirmAdd(3000);
		return "success";
	}
}
复制代码

TCC失败情况 -- Confirm阶段失败

  1. 农行检查老王账户状态,再将老王卡里的10000块扣减3000块,剩下7000块,往老王的预转出账户里增加3000块。(Try)
  2. 工行检查儿子账户状态,再将儿子的预转入账户里增加3000块。(Try)
  3. 以上步骤全部成功,农行将老王的预转出账户减少3000块,此时工行的服务器挂了,儿子卡里未增加3000块,那么我们认为交易是成功的,只是需要不断重试通知工行将儿子的预转入账户减少3000块并往卡里添加3000块。
class Transfer{
	String transfer(){
		//农行预转出
		boolean nhTrySuccess = nonghang.tryReduce(3000);
		if (!nhTrySuccess) {
			return "fail";
		}
		//工行预转入
		boolean ghTrySuccess = gonghang.tryAdd(3000);;
		if (!ghTrySuccess) {
			boolean nhCancelSuccess = false;
			while(!nhCancelSuccess){
				//农行取消转出
				nhCancelSuccess = nonghang.cancelReduce(3000);
			}
			return "fail";
		}
		//农行确认转出
		boolean nhConfirmSuccess = false;
		while(!nhConfirmSuccess){
			nhConfirmSuccess = nonghang.confirmReduce(3000);
		}
		//工行确认转入
		boolean ghConfirmSuccess = false;
		while(!ghConfirmSuccess){
			ghConfirmSuccess = gonghang.confirmAdd(3000);
		}
		return "success";
	}
}
复制代码

总结

TCC事务与2PC事务对比,有什么区别?

从伪代码中我们不难看出,TCC实际上是将事务的提交和回滚方式搬到了应用代码层,将2PC的一个大的分布式事务,拆分成多个本地小事务执行,通过编码的方式来完成整个事务的生命周期。减少了对相关资源的长时间锁定,提高了可用性。

伪代码的TCC的实现方式,有什么缺陷?

  • 对真正业务代码入侵大,真正的业务只涉及到4行代码,其他的都是补偿和确认流程的控制。难以更加复杂的场景需要多大的代码量。
  • Confirm和Cancel接口方法需要做幂等性校验,保证数据一致性。

需要改进的地方

可将入侵的非业务代码,即补偿方式的核心思想抽象出来,形成类似2PC中协调器的组件,管控整个补偿流程,尽量减少代码的入侵。

TCC核心思想落地的框架

  • Hmily(源码简单,容易阅读)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

成为乔布斯

成为乔布斯

[美] 布伦特·施兰德、[美] 里克·特策利 / 陶亮 / 中信出版集团 / 2016-10 / 69.00元

本书描绘了一位多姿多彩的人物将与生俱来的激情与成熟的管理方式相结合,打造出史上最有价值、最受消费者追捧的公司,这本书将彻底改变我们看待乔布斯的方式。 本书推翻了关于史蒂夫·乔布斯的传说和陈词滥调,比如他是天才和混蛋的结合体,暴躁易怒、自私自利,怠慢朋友与家人。本书揭示了这位苹果联合创始人和CEO的家庭生活与职业生涯,并回答了一个关键问题:为什么如此轻狂傲慢、以至于被赶出苹果的年轻人能成为史上......一起来看看 《成为乔布斯》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具