分布式事务解决方案

什么是分布式事务

在大的操做集合中,全部的小操做都属于不一样的服务器,不一样的应用,分布式事务须要保证这些小操做要么一块儿成功,要么一块儿失败。本质上,分布式事务为了保证数据的一致性mysql

分布式事务产生的缘由

  1. 数据库分库分表(当一个操做须要访问01库又要访问02库的时候就会有这个问题)
  2. SOA服务化(全部业务拆分到不一样的模块中,数据存储在不一样的服务器中,因此须要用到分布式事务)

ACID事务特性

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

分布式事务的解决方案

  1. 基于XA协议的二阶段提交
  2. 消息事务+最终一致性
  3. TCC编程模式

二阶段提交

XA是分布式事务协议, 总的来讲 XA协议比较简单,容易实现,可是缺点是sql

  1. 同步阻塞 全部事务参与都在等待其余参与者响应的时候都处于同步阻塞的状态
  2. 单点问题
  3. 数据不一致
  4. 太过保守 任何节点失败 都会致使整个事务失败

性能不理想,mysql的XA实现,没有记录prepare阶段日志,许多nosql也没有支持XA数据库

消息事务+最终一致性

A系统 发送prepare信息到 mq 而后获得mq 的返回后进行本地事务 而后在发送执行成功的消息进入mq,接着B系统得到到A系统完成本地事务的通知后 执行本身的事务 A系统经过消息回调来知晓 事务是否成功编程

若是A完成事务 B没完成 则再mq中会不断发起请求,知道B完成事务为止服务器

缺点: 该解决方案只是最终一致性,若是B一直不成功,那其实AB 就不是一致性,因此须要业务方去抉择,判断markdown

TCC编程模式

TCC 提供一个编程框架,Try Confirm Cancel 三个操做框架

每一个业务方都须要实现这3种操做 try用于事务资源的预留,cancel用户资源不足时候的cancel方法,必须保证幂等。nosql

协调器调用每一个业务方的confirm接口 发现全部参与者的confirm方法都ok了 则分布式事务结束分布式

若是失败次数过多,都须要进行事务补偿性能

缺点 业务须要实现这3个操做 对业务侵入较大

总结

分布式事务,本质上针对多个数据库的事务进行统一控制,按照控制力度分为 不控制,部分控制,彻底控制

不控制 表现为不引入分布式事务
部分控制 消息事务+最终一致性,TCC编程
彻底控制 两阶段提交

性能优缺点: 控制力度越大  性能,qps 都会降低,可是一致性会提升
复制代码