1分布式事务场景
以电商项目为例,项目初始都是单体架构,比如现在需要下单时,需要做的是1创建订单2减库存3增加用户积分,当没有分库时,可以通过本地事务控制数据的一致性,但是以现在的微服务架构时,这3个操作是通过服务调用实现的,无法通过本地事务保证事务的一致性,比如1和2执行成功,3失败了,无法通过本地的transaction回滚,如果保证事务的一致性成为关键。目前有几种流行的做法:比如阿里的seata提供了几种方式,分别为tcc模式,AT模式,sagas模式,现在分别简单记录下原理。
2seata的TCC模式
tcc模式为try confirm cancel模式,最简单的方法为在try方法里提供一种探测方法,比如针对订单模块:
在try里创建一笔不可见的订单,
在confirm里为把订单置为有效的代码段,
在cancel里写删除这条订单的代码;
针对减库存模块:
在try里创建一笔冻结的库存
在confirm里为把冻结的库存减掉
在cancel里把冻结的库存还原到原来的库存
针对用户积分模块:
在try里创建一笔带加入的积分
在confirm里为把积分加给用户
在cancel里删除带加入积分
在这种情况下,当3增加用户积分都成功时,1和2分别执行confirm里的逻辑;如果3失败了,则1和2分别执行cancel逻辑。
用阿里的seata的tcc模式,只需要提供@LocalTCC注解就行了,在接口里提供commit和rollback方法就行了,不用自己判断成功或失败调用commit或rollback,组件会自己判断