分布式事务

一、什么是分布式事务

分布式事务:涉及多个数据库或服务的事务

二、场景举例

 

下单:商品下单调用订单服务-->订单服务调用库存服务查看库存数量-->库存够-->DB-1-->返回订单服务信息-->订单服务DB中订单量+1

   若库存DB数量-1成功,而订单DB数量+1失败,会导致整个下单流程出现异常。库存DB回滚,若之前经历了好多服务,则所有服务都需要编写代码进行回滚。代码量很大

解决方法:引入协调者,库存服务与订单服务执行的最终结果都交给协调者进行统一管理

三、两阶段提交协议

1、服务1与服务2开始事务,分别执行自己对应的业务逻辑,并向协调者上报执行状态

2、当服务1与服务2提交的结果都正常时,协调者向两服务发送commit指令

   当有一个服务提交结果失败或某一服务提交结果超时,协调者向两服务发送回滚指令

缺点:单点故障:协调者挂掉

   阻塞资源:在服务向协调者上报结果状态后,协调者向两服务发送commit操作前,会占用有限的数据库连接

   数据不一致:第一阶段两服务都向协调者发送了正确响应,第二阶段协调者向两服务发送commit指令时,服务1正确提交,服务2网络断开导致服务2commit失败

3、解决阻塞资源:记录数据的初始状态

          第一阶段在执行完业务后直接commit,并记录数据初始状态。第二阶段中若为commit,直接删除数据的初始状态,第二阶段为rollback,直接操作数据的初始状态

4、解决数据不一致:服务1DB由A-->B,服务2DB由1-->2。用脚本检查B是否对应2,若A-->2,A前滚到B或2回滚到1

四、三阶段提交协议

1、首先协调者向服务发起请求,让服务去判断是否能够执行操作。避免服务在执行业务时返回no场景下占用数据库连接

2、服务端执行业务,向协调者上报执行结果状态

3、协调者下发commit指令

 

 

posted @ 2022-05-30 21:27  showMeTheCodes  阅读(25)  评论(0编辑  收藏  举报