分布式事务的背景

分布式事务的背景

常见事务:数据库事务

ACID,Spring @Transactional

分布式事务产生场景

  • 跨库事务
  • 跨网络事务,微服务拆分之后,对同一个数据库的表操作
  • 解决分布式系统中数据一致性问题

X/Open DTP事务模型

定义了一个2PC(二阶段提交)模型,定义了XA协议去负责事务提交或回滚

分布式事务的背景_第1张图片

分布式事务的背景_第2张图片

-- 第一阶段
xa start 'xatest';
insert into user values('Lucifer', 'Lucifer');
xa end 'xatest';
xa prepare 'xatest'; --将数据写入到redolog中

-- 第二阶段
xa commit 'xatest'; --提交写入操作到数据库
xa rollback 'xatest'; --回滚写入操作

Oracle / Mysql数据库都提供了对XA协议的支持,但是使用过程中需要对其进行包装

开源分布式事务框架

  • Seata(XA)
  • Atomikos
  • Bitronix

CAP定理(CP / AP)

  • C: 强一致性
  • A: 可用性
  • P: 分区容错性, 当出现网络分区,是否允许可用

Base理论

  • BA:基本可用
  • S:柔性状态,可以不用实时强一致,但必须最终一致
  • E:最终一致性

分布式事务一致性解决方案

  • TCC事务
  • 补偿
  • 定时校对

基于可靠性消息的最终一致性方案

是对BASE理论的落地

生产端通过本地消息事务解决数据不一致问题

分布式事务的背景_第3张图片

幂等性(执行1次和执行多次有着相同的结果)

消费端可能存在消息重复消费的问题,可以通过以下幂等性解决重复消费问题

  • 消息表,用MD5值+唯一约束,如果重复消费抛异常DuplicateKeyException
  • redis,setNx方法
  • 状态机,修改数据状态(某个状态在状态机中只会存在一次)
  • 上游生成唯一id

分布式事务的背景_第4张图片

TCC事务

TCC是一种弱一致性模型,和XA类似,都是二阶段提交,XA是数据库层面二阶段,TCC是代码层面二阶段提交

Try:先将资源占用

Confirm:如果Try成功,那么Confirm提交

Cancel:如果Try失败,那么Cancel回滚

分布式事务的背景_第5张图片

 

你可能感兴趣的:(java,分布式)