SpringCloud-Seata处理分布式事务

Seata

seata术语:
TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
处理流程:
1.TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID
2.XID在微服务调用链路的上下文中传播
3.RM向TC注册分支事务,将其纳入XID对应全局事务的管辖
4.TM向TC发起针对XID的全局提交或回滚协议
5.TC调度XID下管辖的全部分支事务完成提交或回滚请求

案例说明

这里我们会创建三个服务,一个订单服务,一个库存服务,一个账户服务
当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存来扣减下单商品的库存,再通过远程调用账户服务来扣减用户账户里的余额,最后在订单服务中修改订单状态为已完成。

说一下最重要的东西:这三个的项目都需要加入下面的两个文件:(可以直接复制seata解压后conf文件夹的文件)
SpringCloud-Seata处理分布式事务_第1张图片
file的修改,和seata安装后的修改,唯一的区别是:
SpringCloud-Seata处理分布式事务_第2张图片

而其他的东西可以直接复制粘贴!!!!!(注意一定要看seata安装后我是怎么配置的:传送门)

三个数据库中也都必须有下面的这个表:(来源于seata解压后的conf目录)
SpringCloud-Seata处理分布式事务_第3张图片

需要添加下面的依赖:

        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-seataartifactId>
            <exclusions>
                <exclusion>
                    <artifactId>seata-allartifactId>
                    <groupId>io.seatagroupId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>io.seatagroupId>
            <artifactId>seata-allartifactId>
            <version>0.9.0version>
        dependency>

其实seata的使用就是一个注解标签: @GlobalTransactional
下面只展示订单order的关键性service方法:

    @GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)//seata的关键
    public void create(Order order)
    {
     
        log.info("----->开始新建订单");
        //1 新建订单
        orderDao.create(order);

        //2 扣减库存
        log.info("----->订单微服务开始调用库存,做扣减Count");
        storageService.decrease(order.getProductId(),order.getCount());
        log.info("----->订单微服务开始调用库存,做扣减end");

        //3 扣减账户
        log.info("----->订单微服务开始调用账户,做扣减Money");
        accountService.decrease(order.getUserId(),order.getMoney());
        log.info("----->订单微服务开始调用账户,做扣减end");

        //4 修改订单状态,从零到1,1代表已经完成
        log.info("----->修改订单状态开始");
        orderDao.update(order.getUserId(),0);
        log.info("----->修改订单状态结束");

        log.info("----->下订单结束了,O(∩_∩)O哈哈~");

    }

上面的 扣减库存 和 扣减账户 账号都是使用openfeign做远程调用。

只有加上@GlobalTransactional标签才能使得这个order的订单服务形成一个事务。要么同时成功,要么同时失败!!!

你可能感兴趣的:(SpringCloud,java,数据库,mysql)