十一. SpringCloud Alibaba (17)

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原理浅析

image-20210307181746642

再次理解TC/TM/RM三个组件 - 分布式事务的执行流程:

TM开启分布式事务(TM向TC注册全局事务记录)

按业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)

TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)

TC汇报事务信息,决定分布式事务是否提交还是回滚

TC通知所有RM提交/回滚资源,事务二阶段结束

AT模式如何做到对业务的无侵入:

AT模式

image-20210307182243617

一阶段加载

image-20210307182347457

二阶段提交

image-20210307182415129

二阶段回滚

image-20210307182436598

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszdz.html