这一篇分布式事务,讲得太好了!
在下单的时候,需要在订单表中插入一条数据,然后把库存减去一
在搜索的时候如果点击了广告,需要先记录该点击事件,然后通知商家系统扣除广告费
canCommit(trans),协调者询问参与者是否可以提交事务,参与者回复自己的投票结果。
doCommit(trans),协调者告诉参与者提交它的那部分事务。
doAbort(trans),协调者告诉参与者放弃它的那部分事务。
haveCommitted(trans, participant),参与者用该操作向协调者确认它提交了事务。
getDecision(trans),当参与者在投Yes票后一段时间内未收到应答时,参与者用该操作向协调者询问事务的投票表决结果。该操作用于从服务器崩溃或从消息延迟中恢复。
协调者向分布式事务的所有参与者发送canCommit?请求
当参与者收到canCommit请求后,它向协调者回复自己的投票(Yes/No)。
协调者收集所有的投票(包括它自己的投票)。
如果不存在故障并且所有的投票都是Yes时,那么协调者将决定提交事务并向所有参与者发送doCommit请求
否则,协调者决定放弃该事务,并向所有投Yes票的参与者发送doAbort请求
投Yes票的等待者等待协调者发送的doCommit或者doAbort请求。一旦参与者接收到任何一种请求消息,它将根据该请求放弃或者提交事务。如果请求是提交事务,那么他还要向协调者发送一个haveCommitted来确认事务已经提交。
对持久性存储的写操作可能发生故障(或因为写操作无效或因为写入错误的值)。例如,将数据写到错误的磁盘块被认为是灾难性故障。文件存储可能损坏。在持久性存储中读数据时可根据校验和来判断数据块是否损坏。
服务器可能偶尔崩溃。当一个崩溃的服务器由一个新进程取代后,它的可变内存被重置,崩溃之前的数据均丢失。此后新进程执行一个可恢复过程,根据持久存储中的信息以及从其他进程获得的信息设置对象的值,包括两阶段提交协议有关对象的值。当一个处理器出现故障时,服务器也会崩溃,这样它就不会发送错误的信息或将错误的值写入持久存储,即它不会产生随机故障。服务器崩溃可能出现在任何时候,特别是在恢复时也可能出现。
消息传递可能有任意长的延迟。消息可能丢失、重复或者损坏。接收方(通过校验和)能够检测到受损消息。未发现的受损消息和伪造的消息可能会导致灾难性故障。
支付宝在扣款事务提交之前,向消息队列发送消息。此时的消息队列只记录消息,而并没有将消息发往余额宝。
当支付宝扣款事务提交成功,向消息队列发送确认。在得到确认的指令后,消息队列向该消息发往余额宝。
当支付宝扣款事务提交失败,向消息队列发送取消。在得到取消的指令后,消息队列取消该消息,该消息将不会被发送。
对于那么未确认的消息,需要消息队列去支付宝系统查询这个消息的状态,并进行更新。(因为支付宝可能在扣款事务提交成功后挂掉,此时消息的状态未被更新为:“确认发送“。从而导致消息不能被发送。)
Exactly-once delivery
Guaranteed order of messages
(完)
——长按关注Java大后端——