Seata事务操作实战,快速搞定分布式事务

Hi各位网友好, 我是享学课堂的James,我下周马上要讲seata相关的实战及源码了, 提前把准备内容先公布出来, 有疑问直接联系我, 文章最后有我的V.

1,下载seata

https://github.com/seata/seata/releases

或到James的网盘下载

链接:https://pan.baidu.com/s/1-18nNRULIR-LwPPyRHsIOg

提取码:l6r9

注意: 先需要把nacos启动

2,安装seata

A>windows:需要先安装python,

Python下载链接:
https://pan.baidu.com/s/1R9noMDxKMT_D6O6ooKpIqg 提取码:jbs2

环境变量: path 加上 D:\Program Files\python

cmd进入doc窗口

cd  seata-server-0.9.0\seata\conf
python nacos-config.py 127.0.0.1

B>LINUX环境直接执行:

cd  seata-server-0.9.0\seata\conf
sh nacos-config.sh 127.0.0.1

3,seata启动

cmd进入doc窗口

cd  seata-server-0.9.0\seata\bin
seata-server.bat -p 9000 -m file

Seata启动成功, 进入nacos界面会发现
在这里插入图片描述

服务列表多了一个 serverAddr 就是seata服务
在这里插入图片描述

表示seata启动成功

4,Seata如何实现事务控制?

OK那如何使用seata实现事务控制呢?
首先初始化数据表, 然后在我们的数据库中新建一张undo_log表,这张表是Seata记录事务分支日志必用的表.

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  `ext` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

比如

1,在订单服务要下订单, 先向seata申请BranchID, 写入到undo_log表,提交分支事务状态

2,在扣减库存业务时, 向seata申请另一个BranchID, 写入到undo_log表,提交分支事务状态

在这里插入图片描述

Seata启动了, 表也建了, 代码也改了, 现在要在微服务里用seata, 需要引入seata的jar包

1,引入jar包

在需要进行分布式控制的微服务中进行下面几项配置:

在父工程pom.xml引入seata的依赖

<!--seata组件-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

<!--config组件-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2,proxy代理数据源配置

在涉及到的微服务(order/product)里, 要加上 代理数据源配置类

DataSourceProxyConfig

Seata是通过代理数据源实现事务分支的,所以需要配置

io.seata.rm.datasource.DataSourceProxy的Bean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

package com.enjoy.config;

import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class SeataDataSoureProxy {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    @Primary
    @Bean
    public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }
}

3,核心配置拷贝

把磁盘seata/conf下的registry.conf拷贝到(order/product两工程)resources下
在这里插入图片描述

4,新建yml文件

在order/product工程的resources目录下, 新建bootstrap.yml

在这里插入图片描述

配置如下:

spring:
  application:
    name: service-order
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # nacos的服务端地址
        namespace: public
        group: SEATA_GROUP
    alibaba:
      seata:
        tx-service-group: ${spring.application.name}

OK,以上是seata要用的所有准备工作及环境
准备工作完成后, 我们还要准备好nacos, 并准备好2个有调用关系的微服务, 进行测试, 各位如果在微服务和naocs上有问题, 可以关注我的直播间, 也可以直接加我V: enjoy_james

猜你喜欢

转载自blog.csdn.net/luoyang_java/article/details/112910720