近两年微服务变得越来越火热,各种框架与组件的出现,更是为微服务的开发提供了便利。

我们都知道,每个微服务都是一个对应的小服务,多个服务之间可以方便的进行功能的组合,来形成功能更强大的服务。服务间数据与部署都是独立的,这样故障也可以做到相互隔离。但是这也带来了分布式应用都会面对的问题:

如何保证多个服务间的事务?怎样才能使操作的原子性、一致性等得到保证?

对于传统的应用开发与部署,可以通过数据的事务来保证所谓的ACID,而微服务的场景下,数据库就力不从心了。

这个时候,2PC、3PC轮番登场,来解决这类的问题。但有些场景下,我们根据自己的真实需要,并不需要纯的2PC,比如你只关心数据的原子性与最终一致性,那2PC阶段的阻塞是你不能忍受的,那就有聪明的人想到了一种新的办法。就是我们今天要说的柔性事务TCC

什么是柔性事务TCC?

我们今天说的柔性事务,「柔」主要是相对于「传统」ACID的刚而言,柔性事务只需要遵循BASE原则。而TCC是柔性事务的一种实现。TCC是三个首字母,Try-Confirm-Cancel,具体描述是将整个操作分为上面这三步。两个微服务间同时进行Try,在Try的阶段会进行数据的校验,检查,资源的预创建,如果都成功就会分别进行Confirm,如果两者都成功则整个TCC事务完成。如果Confirm时有一个服务有问题,则会转向Cancel,相当于进行Confirm的逆向操作。

整个柔性事务有多种实现的思想,例如:

具体使用

之前的项目开发中,我们也有类似的场景需要保证两个微服务间的一致性,根据具体的场景需要,用到了TCC事务。当时是通过部门的一个基础组件,是通过异步补偿的形式来保证。

目前也有一些开源的TCC实现,可以直接在GitHub上获取到,例如下面这个https://github.com/changmingxie/tcc-transaction

基本实现原理

这些TCC的框架,基本都是通过「注解」的形式,在注解中声明Confirm方法与Cancel方法,再通过AOP对带点该注解的方法统一进行拦截,之后根据结果分别再执行 Confirm 或者 Cancel。

代码类似这个样子:

@Compensable(confirmMethod = "confirmRecord

tcc分布式事务_什么是 TCC分布式事务?相关推荐

  1. 分布式交易事务_交易基础和分布式交易

    当客户在网上商店购买商品时,您希望您的订单能够被快速处理和交付. 作为银行客户,您要确保转账期间钱不会神秘地消失. 在企业应用程序中,经典事务保证了诸如一致性和与其他事务的隔离之类的质量. 分布式事务 ...

  2. 请列举你了解的分布式锁_终于搞懂分布式锁是什么了!

    当下在互联网技术架构中,最流行的莫过于分布式架构了.为什么大家纷纷都采用分布式架构呢? 1.高效低廉,将部署在高性能机的程序分散在多个小型机中部署: 2.扩展性强,可随着业务的扩展而横向扩展系统的性能 ...

  3. redis setnx 分布式锁_手写Redis分布式锁

    分布式锁使用场景 现在的系统都是集群部署,每个服务都不是单节点的了.比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3.库存服务需要扣减库存,扣减库存肯定需要锁吧,如果使用Lock或者 ...

  4. mysql的集群和分布式区别_集群和分布式的区别

    简单概括: 集群:多个人在一起做同样的事 . 分布式 :多个人在一起做不同的事 . 负载均衡:决定将任务以某种规则分给谁做. 详细分析 (1)分布式是指多个系统协同合作完成一个特定任务的系统. 分布式 ...

  5. kafka mysql事务_【干货】Kafka 事务特性分析

    特性背景 消息事务是指一系列的生产.消费操作可以要么都完成,要么都失败,类似数据库的事务.这个特性在0.10.2的版本是不支持的,从0.11版本开始才支持.华为云DMS率先提供Kafka 1.1.0的 ...

  6. jdbctemplate 开启事务_来,讲讲Spring事务有哪些坑?

    来自公众号:孤独烟 引言 今天,我们接上文<面试官:谈谈你对mysql事务的认识>的内容,来讲spring中和事务有关的考题! 因为事务这块,面试的出现几率很高.而大家工作中CRUD的比较 ...

  7. npm mysql 事务_一文解读MySQL事务

    经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下. MySQL 事务 本文所说的 MySQL 事务都是指在 I ...

  8. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...

    在开发过程中你是否遇到过这样的问题,当在Controller中调用Service中A()方法,A方法内部又调用Service中B()方法,由于A方法中只有查询操作所以没有加事务控制,B方法中含有多次修 ...

  9. spring 事务_极限 Spring (4) Spring 事务

    Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,Spring 只不过简化了开发人员实现事务的步骤. Spring 提供了两种方式实现事务, 声明式和编程式. 如何选择 ...

  10. mysql4.0事务_聊一聊 MySQL 中的事务及其实现原理

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity).隔离 ...

最新文章

  1. Nginx + 阿里云SSL + tomcat 实现https访问代理
  2. 系统云服务器,系统云服务器
  3. centos6.9搭建lnmp环境
  4. 开发版速达光耀-无公网IP服务器访问整体解决方案
  5. 利用浏览器另存为将网页内容保存为word
  6. JS中用execCommand(“SaveAs“)保存页面兼容性问题解决方案
  7. 2018年春季学期《软件工程》教学总结
  8. 控制台(console)与终端(terminal)理解
  9. 转 vo、po、dto、bo、pojo、entity、mode如何区分
  10. 超级电容模组电压不均衡特性分析
  11. C语言求最长公共子序列
  12. 高德地图 搜索定位 搜索关键词 定位
  13. ios打包ipa 命令安装ipa到iphone
  14. 数据分析入门——美国各州人口分析
  15. 如何让ecshop做淘宝客
  16. 加油站涉税数据管理云平台
  17. 来自灵魂深处的拷问:人为什么要活着?
  18. 六、文件管理(5.文件存储空间的管理)
  19. 微信裂变如何做到单次活动增长10万微信好友?
  20. 高通camx debug log 控制 及 UseCase pipeline debug(四)

热门文章

  1. java B2B2C 源码 Springcloud多租户电子商城系统- Stream重新入队(RabbitMQ)
  2. 从一次react异步setState引发的思考
  3. 20165206 2017-2018-2 《Java程序设计》第三周学习总结
  4. yum使用时 could not resolve host 报错的解决方法
  5. 谷歌地图API位置请求_Google Maps API
  6. js中==与===的区别
  7. bitmap格式分析
  8. BZOJ3559 : [Ctsc2014]图的分割
  9. 【IT职场生存手册】他山之石,可以攻玉【51CTO技术论坛】
  10. Exchange2003-2010迁移系列之十三