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) {

总结

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

相关文章

  • 配置Servlet两种方法以及特点详解

    配置Servlet两种方法以及特点详解

    这篇文章主要介绍了配置Servlet两种方法以及特点详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决spring AOP中自身方法调用无法应用代理的问题

    解决spring AOP中自身方法调用无法应用代理的问题

    这篇文章主要介绍了解决spring AOP中自身方法调用无法应用代理的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringBoot搭建go-cqhttp机器人的方法实现

    SpringBoot搭建go-cqhttp机器人的方法实现

    本文主要介绍了SpringBoot搭建go-cqhttp机器人的方法实现
    2021-12-12
  • Spring Mvc中传递参数方法之url/requestMapping详解

    Spring Mvc中传递参数方法之url/requestMapping详解

    在开发中,参数传递是必不可少的一个功能,下面这篇文章主要给大家介绍了关于Spring Mvc中传递参数方法之url/requestMapping的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • 关于@Scheduled参数及cron表达式解释

    关于@Scheduled参数及cron表达式解释

    这篇文章主要介绍了关于@Scheduled参数及cron表达式解释,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 浅谈一下Java线程组ThreadGroup

    浅谈一下Java线程组ThreadGroup

    ThreadGroup是为了方便线程管理出现了,可以统一设定线程组的一些属性,比如setDaemon,设置未处理异常的处理方法,设置统一的安全策略等等,需要的朋友可以参考下
    2023-05-05
  • 本真的REST架构风格理解

    本真的REST架构风格理解

    这篇文章主要为大家介绍了本真的REST架构风格的深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java使用WeakHashMap实现缓存自动清理

    Java使用WeakHashMap实现缓存自动清理

    在 Java 中,内存管理是一个重要的话题,尤其是在涉及到缓存的实现时,如果缓存项不再被使用,我们希望它们能被自动清理,而不必手动删除,WeakHashMap 就是 Java 提供的一种用于缓存和内存管理的工具,本文将深入探讨如何利用 WeakHashMap 来实现缓存自动清理
    2025-01-01
  • java虚拟机深入学习之内存管理机制

    java虚拟机深入学习之内存管理机制

    java虚拟机在程序运行时将内存划分为多个区域,每个区域作用,生命周期各不相同,下面这篇文章主要给大家介绍了关于java虚拟机深入学习之内存管理机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-11-11
  • MyBatis-Plus高级扩展详解

    MyBatis-Plus高级扩展详解

    本文介绍了MyBatis-Plus中逻辑删除和乐观锁的实现概念、方法和示例,逻辑删除通过更改记录状态模拟删除,而乐观锁通过版本号或时间戳确保并发操作的正确性
    2025-03-03

最新评论