• Seata0.7.1配合nacos实现分布式事务


    Seata的三个基本概念:

    TC (Transaction Coordinator) - 事务协调者

    维护全局和分支事务的状态,驱动全局事务提交或回滚。

    TM (Transaction Manager) - 事务管理器

    定义全局事务的范围:开始全局事务、提交或回滚全局事务。

    RM (Resource Manager) - 资源管理器

    管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

    使用Seata

    1.创建具有InnoDB引擎的MySQL数据库

    2.创建 UNDO_LOG 表

    1. -- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
    2. CREATE TABLE `undo_log` (
    3. `id` bigint(20) NOT NULL AUTO_INCREMENT,
    4. `branch_id` bigint(20) NOT NULL,
    5. `xid` varchar(100) NOT NULL,
    6. `context` varchar(128) NOT NULL,
    7. `rollback_info` longblob NOT NULL,
    8. `log_status` int(11) NOT NULL,
    9. `log_created` datetime NOT NULL,
    10. `log_modified` datetime NOT NULL,
    11. `ext` varchar(100) DEFAULT NULL,
    12. PRIMARY KEY (`id`),
    13. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
    14. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    3.从Releases · seata/seata · GitHub,下载服务器软件包,将其解压缩。

    4.pom引入seata,同时注意版本是否和下载的版本对应上

    1. com.alibaba.cloud
    2. spring-cloud-starter-alibaba-seata

    5.修改seata的conf文件(当使用nacos作为注册中心的时候):

     只需修改前六行

    1. registry {
    2. # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
    3. type = "nacos"
    4. nacos {
    5. # 你的nacos地址
    6. serverAddr = "localhost:8848"

    6.启动seata

    去nacos注册中心可以看到,seata已经注册进了nacos

     7.对需要用到分布式事务的service方法上加上注解:

    @GlobalTransactional

    8.对于需要用到分布式事务的微服务都使用seata代理自己的数据源

    1. import com.zaxxer.hikari.HikariDataSource;
    2. import io.seata.rm.datasource.DataSourceProxy;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. import org.springframework.util.StringUtils;
    8. import javax.sql.DataSource;
    9. @Configuration
    10. public class MySeataConfig {
    11. @Autowired
    12. DataSourceProperties dataSourceProperties;
    13. @Bean
    14. public DataSource dataSource(DataSourceProperties dataSourceProperties) {
    15. HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    16. if (StringUtils.hasText(dataSourceProperties.getName())) {
    17. dataSource.setPoolName(dataSourceProperties.getName());
    18. }
    19. return new DataSourceProxy(dataSource);
    20. }
    21. }

    9.将file.conf和registry.conf复制到用到seata的微服务的resource文件夹下

     

    打开resouce中的file.conf,修改31行,将“my_test_tx_group”修改成自己的微服务名字+“-fescar-service-group”,比如:

    vgroup_mapping.gulimall-order-fescar-service-group = "default"

     注:对于主事务使用@GlobalTransactional,主事务调用的其它微服务的分支事务只需要用@Transactional即可

  • 相关阅读:
    数字图像1-opencv c++基本操作
    一篇文章全面解析Modbus协议中的消息帧
    链表OJ题
    Linux-centos系统安装MySql5.7
    ESP8266-Arduino编程实例-L3G4200D三轴陀螺仪驱动
    TRex学习之旅三
    Allegro如何对器件进行等距对齐操作
    N100低功耗win11安装wsl2当入门nas
    面试题-多线程-Java 如何实现多线程之间的通讯和协作
    Linux学习笔记(10)----静态库与共享库
  • 原文地址:https://blog.csdn.net/xushuai2333333/article/details/127394293