作者回复: 由于事务执行器有超时机制,数据库本身也有事务超时机制,如果是第一阶段失败或者超时的话,会自动回滚。 对于第二阶段的问题,如果db宕机,确实有可能出现数据不一致的问题,对于这种情况,可以用脚本根据业务做一些补偿处理。
作者回复: 这个过程就不需要再用事务保证了,否则就死循环了。 可以先清空购物车,再删除本地消息(一般都是更新状态)。即使出现不一致,购物车清了,本地消息表没更新成功,下次再执行一次清空购物车,也问题不大。
作者回复: 一般是直接减掉,但需要记录锁定库存的商品、时间戳,后续超时未支付的情况下,再把库存释放出来。
作者回复: 你说的这种降级方案感觉像是降级成了本地消息表。
作者回复: 还是要自己实现的。
作者回复: 一般是先锁定库存,然后定时扫描未支付的订单,自动取消超时未支付订单,取消订单的流程中自然就会释放库存。 你会发现,很多秒杀活动要求支付时间都很短,就是这个原因。
作者回复: 理论上这两个RM是并行提交的,无所谓谁先谁后。要说细微区别,就是如果某一个数据库宕机后,数据不一致的情况会有区别。
作者回复: 如果是HTTP协议的话,可以在RM(事务参与方)Session中,或者内存中维护进行中的事务,通过事务ID区分。 第二阶段提交命令从协调者发到RM上之后,根据事务ID查找对应的数据库会话,进行提交。
作者回复: 👍👍👍