实际状况:MySQL单表数据达到千万级别后,会随数据量增大,会出现性能降低的状况,这时须要分表保存数据数据库
后端按功能切分后,须要保持库存与支付模块的数据一致性。编程
A:原子性,在整个事务中的全部操做,要么所有完成,要么所有不作,没有中间状态。对于事务在执行中发生错误,全部的操做都会被回滚,整个事务就像从没被执行过同样。后端
C:一致性,事务必须始终保持系统处于一致的状态,无论在任何给定的时间并发事务有多少。安全
I:隔离性,事务与事务之间不会互相影响,一个事务的中间状态不会被其余事务感知。并发
D:持久性,一旦事务完成了,那么事务对数据所作的变动就彻底保存在了数据库中app
A:准备后,仍可提交与回滚分布式
C:准备时,一致性检查必须OKide
I:提交完成前,事务结果仍然只在事务内可见性能
D:提交完成后,事务结果已经持久ui
问题
准备阶段的持久成本
全局事务状态的持久成本
潜在故障点多
准备后发生故障以后的恢复
CAP原理
Consistency(一致性): 全部用户看到一致的数据
Availability(可用性): 总能找到一个可用的数据复本
Partition(分区容忍性): 即便在系统被分区的状况下,仍然知足上述两点
BASE
BA(Basic Availability):基本可用性
S(Soft state):柔性状态
E(Eventuallconsistency):最终一致性
咱们的目标
知足用户的一致性
可查询服务
幂等服务
tcc服务
可补偿服务
2. 一致性解决方案 - 依赖事务日志的恢复/补偿/重试
可靠消息送达(幂等服务)
tcc(tcc服务)
交易编排(可查询服务、幂等服务、可补偿服务)
客户充值,三方支付划扣异常,客户能够直接提现
客户提现,三方支付付款超时(成功),客户能够重复提现
要保护资金的安全
5、咱们的选择原则
保护系统资金(利益)安全
保持客户体验一致性
TCC的多级系统的嵌套事务很差解决
TCC对于外部系统提供的服务要求很高,必须所有知足TCC服务要求,实际场景下不少外部服务提供方没法提供TCC服务,而且提供方的服务也没法很好地经过代理层封装为TCC服务
全部提供给外系统调用的服务接口,均须要记录流水号,服务接收时插入流水,服务完成时更新流水,该流水用于提供可查询的服务能力
全部调用外部系统接口的操做,均须要记录流水,接口调用前插入流水,调用完成时更新流水,该流水用于提供交易编排时的重试、查询和反冲
全部提供给外系统调用的服务接口,均系统有流水号字段,该字段在系统内部不能重复,用于提供幂等或交易重复提示的功能