首页 > 其他分享 >115、商城业务---分布式事务---使用Springboot提供的Seata解决分布式事务

115、商城业务---分布式事务---使用Springboot提供的Seata解决分布式事务

时间:2023-02-23 16:57:58浏览次数:29  
标签:事务 seata springframework --- import NULL 分布式

https://seata.io/zh-cn/

seata使用Seata AT模式控制分布式事务的步骤:
1、每一个想控制分布式事务的服务对应的数据库都需要创建一个UNDO_LOG 表

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;

2、下载并安装事务协调器seata-server
https://github.com/seata/seata/releases

3、整合
(1)导入依赖注意只要在需要seata的服务中导入,因为如果在不需要seata的服务中导入,这个服务中又没有相应的seata配置,就会报错导致服务无法启动

       <!--引入管理分布式事务的seata-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

springcloud版本是Greenwich.SR3,springboot版本是2.1.8.RELEASE引入的seata-all的版本是0.7.1
所以下载seata-server版本是0.7.1
(2)、安装seata-server0.7.1版本
首先修改seata-server中的配置,将他加入我们的nacos注册中心管理

(3)使用seata只需要使用注解@GlobalTransactional标在方法上

(4)所有想要使用分布式事务的微服务都要使用seata DataSourceProxy代理自己的数据源

package com.gulimall.order.config;

import com.zaxxer.hikari.HikariDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;

/**
 * 使用seata DataSourceProxy代理自己的数据源
 */
@Configuration
public class MySeataConfig {

    @Autowired
    DataSourceProperties dataSourceProperties;


    @Bean
    public DataSource dataSource(DataSourceProperties dataSourceProperties) {

        HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
        if (StringUtils.hasText(dataSourceProperties.getName())) {
            dataSource.setPoolName(dataSourceProperties.getName());
        }

        return new DataSourceProxy(dataSource);
    }

}

(5)每个微服务都必须导入registry.conf、file.conf
这两个文件都在我们的下载的seata-server文件夹中。
同时修改file.conf中的下面位置

即修改成vgroup_mapping.项目名-fescar-service-group = "default"
(6)给分布式大事务的入口标注@GlobalTransactional
(7)给大事务中调用的远程方法上只需要标注@Transactional即可
4、进行测试,发现如果一个服务发生异常回滚,则它方法中调用的远程事务也会回滚

标签:事务,seata,springframework,---,import,NULL,分布式
From: https://www.cnblogs.com/morehair/p/17148663.html

相关文章

  • C/C++宠物信息管理系统[2023-02-23]
    C/C++宠物信息管理系统[2023-02-23]计算机科学与技术专业课程设计任务书学生姓名专业班级学号题目宠物信息管理系统主要内容开发一个简单的宠物信息管理系统。要......
  • 虚拟环境 venv的使用--(venv 一)
    一、引言最近在学习《FlaskWebDevelopment2ndEdition》的时候,作者开篇就介绍如何使用venv来管理Python环境。自我觉得作者讲的非常好,想要将其总结下来,方便自己日......
  • 【人脸检测】(MTCNN) Joint Face Detection and Alignment using Multi-task Cascaded
    原始题目JointFaceDetectionandAlignmentusingMulti-taskCascadedConvolutionalNetworks中文名称基于多任务级联卷积网络的联合人脸检测与对齐......
  • Django框架课-创建游戏界面 (2)
    Django框架课-创建游戏界面(2)bug修改bug1:获取鼠标在画布中的相对坐标之前写的只是直接获取在屏幕中的坐标,默认画布是在左上角的,如果acapp的窗口不在屏幕左上角,获取到......
  • redis分布式锁的实现
    一.正常加锁当两个用户同时注册一个用户名时,为保证用户名不能重复,因此对其注册的用户名加锁。具体步骤:获得用户注册的用户名,进行判断,如果为空则对其进行加锁,保存到数据......
  • 2023-02-23 {"errMsg": "getImageInfo:fail download image fail. reason: downloadFi
    描述:微信小程序绘制图片业务,开发工具测试,真机测试,体验版测试均没问题,正式上线后报错:downloadFile:失败url不在域列表中报错原因:接口路径没有写在downloadFile合法域名里面......
  • 深度学习-LSTM
    目录前言神经网络的历史和背景循环神经网络的出现及其作用LSTM在处理序列数据中的应用LSTM的基本原理LSTM的结构和原理遗忘门、输入门、输出门的作用LSTM的训练方法代码LST......
  • 测试公开课资料系列01--Fiddler之AutoResponse在线调试利器
     前言做的技艺来自做的过程。明天晚上,笔者在腾讯课堂开播一堂Fiddler实战公开课,嗯~先预先筹备一些课堂资料给大家来分享一、Fiddler在线调试介绍Fiddler在线调试-->Fid......
  • 集群调度LSF-学习笔记
    集群-------多台设备HPC集群----多台用于计算的设备集群调度-LSF:LSF是一种强大的工作负载管理平台,提供基于各种策略的智能调度功能,利用分布式的基础架构资源来提高整体的......
  • go 神奇的错误 time.Now().Format("2006-01-02 13:04:05") 比北京时间大8小时
    困倦的时候写了个个获取本地时间,打印总比当前时间大8小时,找了很久原因 packagemainimport("fmt""time")funcmain(){now:=time.Now()f......