分布式事务

对于分布式事务即在一个业务方法里有多个步骤对不同数据库的表操作需要保证同时成功或同时失败,传统事务中使用注解在操作数据库的业务方法上加失败回滚就能完成数据一致性,当这个事务由多个事务组成并且存在远程事务,就会出现各种问题,比如网络超时异常,会导致已经成功的远程事务在本地定义为失败,之前的事务也被回滚,再如通过远程事务的操作成功来指定当前事务是否抛出异常,如果远程事务失败,远程自然会回滚,本地根据返回值是都抛出异常来决定之前事务是否回滚,但问题来了,如果远程成功了,在接下来的远程请求中触发失败异常,回回滚当前服务的本地事务,对于之前的已经成功的远程事务是无法回归的,也就是多个事务的本地事务容易控制,但对于已经处理的远程事务是无法施加影响的。

      事务失效方式

如有service1,2,3这三个服务服务1中a方法添加了事务注解,调用当前服务的b,c方法,要想b,c生效必须满足b,c也添加了事务注解,否则执行的时候是目标对象执行,并非代理对象无法实现回滚,其次如果使用事务传播机制不同b使用required传播机制那么a,b方法在同一个事务内可以回滚,c使用required_new那么c方法会创建自己的事务,他报错后其他事务不回滚,如果当前服务1要想调用其他服务的方法并想他启用事务,必须使用服务名加方法调用,服务名用来接收代理对象,满足事务回滚,否则如果其他服务没有通过注解或者编程式生成代理对象那么事务内所执行的方法无事务,相当于执行正常的方法。

 

分布式事务cap理论

只能满足cp和ap,一致性的实现比如当前服务要使用三个节点,如何实现强一致性,使用一致性raft算法,初始化三个无状态节点,其中一个节点会查找是否有leader没有就会变成后选节点,候选节点会向其他节点发起投票请求,如果得到一半以上当前后选节点会升级为leader节点,后续对其他节点的修改通过主节点实现同步,例如当客服端要向主节点设置x=5时,主节点会先写入同步日志,然后将日志发送给从节点,从节点收到后返回给主节点,如果主节点收到一半以上的回复,则提交修改,修改成功后通知从节点也要完成数据同步设置x=5那么所有节点完成一致性操作

两段延迟时间:第一选举超时 如果从节点想成为后选节点,这段时间超时一般在130ms和300ms之间,只要从节点自旋投票后,时间会重置为0。第二消息超时时间,心跳时间,主节点每隔一段时间向从节点发送消息,从节点收到后会重置选举时间,表示当前主节点有效,当从节点300ms没收到就会成为后选者,并发起投票,例如leader节点宕机,那么这两个节点就开始自旋到超时,最先到超时的自旋节点收不到消息后主动升级为候选者并向其他节点发送投票选举,其他从节点收到后并响应,重置超时时间,继续自旋,候选者会给自己投票得到一半投票就成为主节点,并和其他从节点保持心跳

 

主节点宕机,这时候两个从节点同时自旋到超时时间,就会形成两个候选者,例如有a,b,c,d节点,a,c同时到自旋时间成为后选节点,此时两个竞争a,c候选节点会向b,d发起投票,如果a发起投票请求先于c到达b那么a获得b投票,每一次投票请求只能到达一个,c的投票会被拒绝,如果a,c票数一样,就重新来一轮自旋,包括从节点,如果到自旋时间也会成为后选节点,发起投票,直到选举投票获得过半会成为主节点。raft动画效果演示地址http://thesecretlivesofdata.com/raft/

raft.github.io

数据同步,主节点会在心跳的下一次发送日志同步到从节点,从节点收到后会回应主节点,并重置自旋时间为0,主节点得到大多数节点回复,就会执行数据修改提交,完成修改同时向从节点发送数据从节点完成数据提交,主节点收到大多数节点成功后响应给客户端。

如果多个节点分在两个区域,一个区域有两个节点,另一个区域有4个节点,突然两个区域断网,区域1两个节点无法收到大多数同步数据响应,所以无法更新客户端请求的数据,区域二会选举自己的leader请求更新数据也能更新,突然两个区域的网络联通,那么区域1的领导是老领导,区域二的领导为新领导,区域1的领导失效,并回滚所有同步的日志,并同步区域二的日志完成数据同步

这样即便有分区错误也能完成数据的一致

重点 1自旋时间决定是否成为候选人,当领导

2心跳时间,在心跳时间后把日志发出去

如果有六个节点两个分区,每个分区有3个,如果分区挂了,每个区域三个节点无法选举新节点,即服务不可用即便节点是活的。

分布式失误解决方案,xa协议新版mysql和sqlServer都支持,使用二阶段提交,有一个总事务管理器,和多个分布式服务事务,总事务管理器会发送询问其他服务事务是否就绪,就绪后再发送是否能提交但凡一个不能完成,那么总事务管理器就不会提交数据。

缺点占用资源大,mysql支持的不太理想,

使用seat分布式事务,它使用的是2pc,二阶段提交,其次有三阶段提交和tcc三阶段手动提交,解决分布式事务有多种方法,最大努力通知,可靠消息通知这些属于柔性事务。

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值