发布网友 发布时间:2023-05-05 17:00
共1个回答
热心网友 时间:2023-10-06 06:51
Try阶段是做业务检查(一致性)及资源预留(隔离)。
Try商品库存为100,用户购买了1个商品,此时商品库存应该检查库存、更新库存数量,同时产生冻结1个商品的数量,此时创建订单调用订单服务,订单状态变为待确认状态,锁定预留资源。
Confirm当Try正常执行之后,会进入Confirm或者Cancel阶段,当订单状态变成完成状态之后,会执行Confirm里面的逻辑,在Confirm逻辑中将冻结数量-1,释放预留资源。
方法:
空回滚在未调用try方法或者try方法执行失败的情况下,就执行了cancel方法进行回滚。比如本地事务try执行失败,导致try本地事务进行了回滚,此时没有必要再调用cancel方法进行回滚,CC模型上,try失败之后一定会进入cancel阶段,导致了空回滚。
解决方法:在cancel阶段逻辑执行之前判断是否执行try操作即可。悬挂一阶段Try操作时,出现网络问题导致超时,此时事务管理器会触发二阶段的回滚,调用TCC的cancel操作,此时cancel调用成功。