1.2 自动选课需求
支付成功即完成订单,订单完成之后系统需自动添加选课。
下图是微信支付、学成在线订单服务、学成在线学习服务交互图:
1、用户支付完成,微信支付系统会主动通知学成在线支付结果,学成在线也可主动请求微信支付查询订单的支付 结果。
最终得到支付结果后将订单支付结果保存到订单数据库中。
2、订单支付完成系统自动向选课表添加学生选课记录。
3、选课记录添加完成学习即可在线开始学习。
2 分布式事务 2.1 问题描述
根据上边的自动选课的需求,分析如下:
用户支付完成会将支付状态及订单状态保存在订单数据库中,由订单服务去维护订单数据库。而学生选课信息在学 习中心数据库,由学习服务去维护学习中心数据库的信息。下图是系统结构图:
如何实现两个分布式服务(订单服务、学习服务)共同完成一件事即订单支付成功自动添加学生选课的需求,这里 的关键是如何保证两个分布式服务的事务的一致性。
尝试解决上边的需求,在订单服务中远程调用选课接口,伪代码如下:
[AppleScript] 纯文本查看 复制代码 订单支付结果通知方法{
更新支付表中支付状态为“成功”。
远程调用选课接口添加选课记录。
}
上边的逻辑说明:
1、更新支付表状态为本地数据库操作。 2、远程调用选课接口为网络远程调用请求。
3、为保存事务上边两步操作由spring控制事务,当遇到Exception异常则回滚本地数据库操作。
问题如下:
1、如果更新支付表失败则抛出异常,不再执行远程调用,此设想没有问题。
2、如果更新支付表成功,网络远程调用超时会拉长本地数据库事务时间,影响数据库性能。
3、如果更新支付表成功,远程调用添加选课成功(选课数据库commit成功),最后更新支付表commit失败,此 时出现操作不一致。
上边的问题涉及到分布式事务控制。
|