产生分布式事务的最大原因是网络抖动的原因导致的
本地事务本地事务具有四个特性 ACID
原子性、一致性、隔离性、持久性
事务的隔离级别:
以mysql为例: 读未提交(脏读)、读提交(不可重复读)、可重复读(幻读)、序列化
事务的传播行为:
当事务嵌套时公用/不公用一个事务
required(公用)、requires_new(不公用)
springboot使用事务传播时的一个问题 同一个对象事务方法默认失效, 原因 绕过了代理对象 事务使用代理对象来控制的 * 解决:使用代理对象来调用事务方法 * 1. 引入 spring-boot-starter-aop 它帮我们引入了aspectj * 2. @EnableAspectJAutoProxy(exposeProxy = true) [对外暴露代理对象] 开启动态代理功能 而不是jdk默认的动态代理 即使没有接口也可以创建动态代理 * 3. 本类互调用代理对象 通过AopContext分布式事务
CAP定理
一致性、可用性、分区容错性,三者不可能同时并存,只能保证AP或者CP
常用的方式为AP 保证服务可用,舍弃强一致
分布式事务中的Raft算法
存在三种类型的角色:领导 选举者 随从
领导选举、日志复制
自旋时间、心跳时间
base定理:保证最终一致性
分布式事务几种方案:
2PC模式3PC模式柔性事务-TCC事务模式柔性事务-本地事务表柔性事务-最大努力性通知柔性事务-可靠消息-最终一致性方案
柔性事务都是用来保证最终一致性:
最终一致性能够容忍高并发以及系统异构
如何保证消息的可靠性?消息队列在使用过程中会存在消息丢失、消息重复、消息积压的情况,如何解决?



