AccountServiceImpl设置超时
@Override public void decrease(Long userId, BigDecimal money) { LOGGER.info("==> account-service中扣减账户余额开始"); //模拟超时异常,全局事务回滚 //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } accountDao.decrease(userId, money); LOGGER.info("==> account-service中扣减账户余额结束"); }数据库情况:① 加进来了但是订单状态为0,表示未支付 ②库存减少了 ③ 钱也被扣了
故障情况:
当库存和账户金额扣减后,订单状态并没有设置为已经完成,没有从0改为1
而且由于feign的重试机制,账户余额还有可能被多次扣减
超时异常,添加了@GlobalTransactional
AccountServiceImpl设置超时
三个数据库都未增加数据,即全局事务回滚了
6.7 Seata原理浅析再次理解TC/TM/RM三个组件 - 分布式事务的执行流程:
TM开启分布式事务(TM向TC注册全局事务记录)
按业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)
TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
TC汇报事务信息,决定分布式事务是否提交还是回滚
TC通知所有RM提交/回滚资源,事务二阶段结束
AT模式如何做到对业务的无侵入:
AT模式
一阶段加载
二阶段提交
二阶段回滚