分布式事务
一、什么是分布式事务
分布式事务:涉及多个数据库或服务的事务
二、场景举例
下单:商品下单调用订单服务-->订单服务调用库存服务查看库存数量-->库存够-->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指令
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。