java分布式事务seata的使用方式

 更新时间:2024年04月27日 16:45:36   作者:jjw_zyfx  
这篇文章主要介绍了java分布式事务seata的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

首先创建一个seata的springboot模块

并引入seata的起步依赖

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

模块的目录结构

如下:

  • seata.yaml中的内容为:
seata:
  tx-service-group: seata-toutiao
  service:
    vgroup-mapping: # 事务组与cluster的映射关系
      seata-toutiao: DEFAULT
    grouplist:
      DEFAULT: 192.168.211.136:8091
  • spring.factories中的内容为:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jjw.core.seata.SeataHeimaAutoConfiguration
org.springframework.boot.env.EnvironmentPostProcessor=\
com.jjw.core.seata.MyEnvironmentPostProcessor
  • MyEnvironmentPostProcessor中的内容为:
package com.jjw.core.seata;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.util.List;

/**
 * 自定义环境处理,在运行SpringApplication之前加载任意配置文件到Environment环境中
 */

public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {

    //Properties对象
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        //自定义配置文件
        String[] profiles = {
                "seata.yaml"
        };
        //循环添加
        for (String profile : profiles) {
            //从classpath路径下面查找文件
            Resource resource = new ClassPathResource(profile);
            //加载成PropertySource对象,并添加到Environment环境中
            environment.getPropertySources().addFirst(loadProfiles(resource));
        }
    }

    //加载单个配置文件
    private PropertySource<?> loadProfiles(Resource resource) {
        if (!resource.exists()) {
            throw new IllegalArgumentException("资源" + resource + "不存在");
        }
        try {
            YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader();
            List<PropertySource<?>> resources = yamlPropertySourceLoader.load(resource.getFilename(), resource);
            return resources.get(0);
        } catch (IOException ex) {
            throw new IllegalStateException("加载配置文件失败" + resource, ex);
        }
    }
}
  • SeataHeimaAutoConfiguration中的内容为:
package com.jjw.core.seata;

import io.seata.rm.datasource.DataSourceProxy;
import io.seata.spring.boot.autoconfigure.properties.SeataProperties;
import io.seata.spring.boot.autoconfigure.properties.client.ServiceProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


/**
 * --加载文件properties
 * https://www.cnblogs.com/huanzi-qch/p/11122107.html
 * --加载yaml
 * https://blog.csdn.net/baidu_28523317/article/details/108701391
 *
 * --顺序
 * https://blog.csdn.net/f641385712/article/details/105596178
 *
 * --可能存在的问题
 * https://segmentfault.com/q/1010000040364236
 */
@Configuration
@ConditionalOnClass(DataSourceProxy.class)
public class SeataHeimaAutoConfiguration {

    //仅仅用作测试
    @Bean
    public Map<String,String> seatax(SeataProperties seataProperties,
                                     ServiceProperties serviceProperties){
        String txServiceGroup = seataProperties.getTxServiceGroup();
        System.out.println(txServiceGroup);
        System.out.println(serviceProperties.getGrouplist());
        return new HashMap<>();
    }
}

在需要用到分布式事务的微服务中添加依赖

(用到几个微服务就给相应的微服务都添加分布式事务依赖)、且对这几个微服务所在的库都添加一个undolog表:

-- auto-generated definition
create table undo_log
(
    id            bigint auto_increment
        primary key,
    branch_id     bigint       not null,
    xid           varchar(100) not null,
    context       varchar(128) not null,
    rollback_info longblob     not null,
    log_status    int          not null,
    log_created   datetime     not null,
    log_modified  datetime     not null,
    ext           varchar(100) null,
    constraint ux_undo_log
        unique (xid, branch_id)
)
    charset = utf8;

在最开始使用分布式事务的那个微服务上的方法上添加事务注解

@GlobalTransactional // 全局事务
@Transactional // 本地事务
@Override
public void pass(Integer id) {

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中基于推、拉模式的sentinel规则持久化详解

    Java中基于推、拉模式的sentinel规则持久化详解

    这篇文章主要介绍了Java中基于推、拉模式的sentinel规则持久化详解,推模式是sentinelDashboard 把规则推给Nacos,Nacos监听规则的变化推给微服务,拉模式是sentinelDashboard 把规则直接给微服务, Nacos定时的同步微服务端的规则,需要的朋友可以参考下
    2023-09-09
  • 关于dubbo的超时处理及重试原则

    关于dubbo的超时处理及重试原则

    这篇文章主要介绍了关于dubbo的超时处理及重试原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 解析Java中所有错误和异常的父类java.lang.Throwable

    解析Java中所有错误和异常的父类java.lang.Throwable

    这篇文章主要介绍了Java中所有错误和异常的父类java.lang.Throwable,文章中简单地分析了其源码,说明在代码注释中,需要的朋友可以参考下
    2016-03-03
  • 关于maven install报错原因揭秘:parent.relativePath指向错误的本地POM文件

    关于maven install报错原因揭秘:parent.relativePath指向错误的本地POM文件

    在使用Maven进行项目构建时,如果遇到'parent.relativePath'指向错误的本地POM文件的问题,可能会导致构建失败,这通常是由于父项目POM文件的相对路径设置错误、本地POM文件与父项目POM文件版本或内容不一致所致,解决方法包括检查并修正父项目POM文件中的相对路径设置
    2024-09-09
  • java实现OpenGL ES纹理映射的方法

    java实现OpenGL ES纹理映射的方法

    这篇文章主要介绍了java实现OpenGL ES纹理映射的方法,以实例形式较为详细的分析了纹理映射的实现技巧,需要的朋友可以参考下
    2015-06-06
  • springboot获取当前用户信息的三种方式

    springboot获取当前用户信息的三种方式

    本文详细介绍了在开发中获取当前操作用户信息的三种方式:使用ThreadLocal存储用户信息、通过拦截器和注解结合Shiro框架获取用户信息、以及使用Redis存储用户信息,每种方式都有具体的实现步骤和注意事项,可根据实际需求选择合适的方法
    2024-10-10
  • MyBatis 实现数据的批量新增和删除的操作

    MyBatis 实现数据的批量新增和删除的操作

    这篇文章主要介绍了MyBatis 实现数据的批量新增和删除的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • springboot读取resources下文件的方式详解

    springboot读取resources下文件的方式详解

    最近写读取模板文件做一些后续的处理,将文件放在了项目的resources下,发现了一个好用的读取方法,下面这篇文章主要给大家介绍了关于springboot读取resources下文件的相关资料,需要的朋友可以参考下
    2022-06-06
  • Java求质数的几种常用算法分析

    Java求质数的几种常用算法分析

    这篇文章主要介绍了Java求质数的几种常用算法,结合实例形式分析了三种比较常见的求质数算法原理及相关实现技巧,需要的朋友可以参考下
    2018-12-12
  • Springquartz的配置方式详解

    Springquartz的配置方式详解

    本文介绍了在Spring框架中使用Quartz进行任务调度的三种方式:使用@Scheduled注解、XML配置和Java配置,每种方式都有其特点和适用场景,感兴趣的朋友一起看看吧
    2025-01-01

最新评论