第一次发博文,略紧张。。。
核心:系统幂等性,记一个操作在系统中重复执行的结果是一样的。
场景:A账户转账给B账户1000块,A账户和B账户属于两个系统System-A和System-B
1. System-A本地事务
a. 开始本地事务
b. A账户扣款1000
c. 写入消息表
d. 完成本地事务
2. 中间消息系统
a. 读取System-A中的未应用的消息
b. 将消息发往System-B
3. System-B本地事务
a. 判断消息是否已经应用
b. 若没有
i. 开始本地事务
ii. B账户增加1000
iii. 写入消息应用表
iv. 完成本地事物
c. 若有
i. 忽略消息
d. 将应用消息发往System-A
4. 中间消息系统
a. 将System-A的消息状态更新
几种异常情况:
1. System-A本地事务阶段失败
a. System-A本地事务回滚
2. 中间消息系统
a. 读取System-A中的未应用的消息(挂掉),消息不会发送
b. 将消息发往System-B发出之后挂掉
i. System-B已经将事务执行,同时System-B接收到同样的消息,会忽略
3. System-B本地事务阶段失败
a. 事务成功消息不会写入消息应用表
b. 若需要补偿,则向本地消息表中添加一条失败消息,由System-A进行补偿
4. 中间消息系统更新状态失败
a. 更新失败,消息将会重复发送
几种经典的分布式事务解决方案: