分布式事务解决方案-Seata

╰半橙微兮° 2023-10-11 19:56 70阅读 0赞

Seata

一、什么是Seata

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

使用seata的原因

在springboot单体架构中,我们只需要使用@Transactional即可开启事务,让事务进行回滚,但在分布式下是无法进行的,因为服务与服务之间无法感知对方是否出错,是否需要进行回滚,无法控制其他服务的事务回滚。
所以就是用到了Seata中间件,成功一起成功,失败一起失败。

二、工作流程

在这里插入图片描述
这是大致的流程图,详细的可以参考官方文档:Seata

三、使用Seata

参考文章
选择 seata 版本之前一定要查看 cloud alibaba 对应的版本,否则会出现很各种问题!
在这里插入图片描述
根据对应的版本安装对应的Seata

1.添加 undo_log 表

每一个要使用分布式事务的数据库都需要一个 UNDO_LOG 表。

  1. CREATE TABLE `undo_log` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `branch_id` bigint(20) NOT NULL,
  4. `xid` varchar(100) NOT NULL,
  5. `context` varchar(128) NOT NULL,
  6. `rollback_info` longblob NOT NULL,
  7. `log_status` int(11) NOT NULL,
  8. `log_created` datetime NOT NULL,
  9. `log_modified` datetime NOT NULL,
  10. `ext` varchar(100) DEFAULT NULL,
  11. PRIMARY KEY (`id`),
  12. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
  13. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.修改Seata配置文件

  • 我们这里使用的是nacos作为注册中心,修改registry.conf配置文件,修改下面两个地方即可
    \seata\conf.registry.conf
    在这里插入图片描述
  • 本地文件配置内容–这里没做修改使用默认
    下面是transaction log store,选择持久化到哪里,我们这里就使用本地文件持久化
    如果是选择其他的就配置对应的配置
    \seata\bin\file.conf
    在这里插入图片描述
  • 双击启动Seata服务:\seata\bin\seata-server.bat
    在这里插入图片描述
  • 启动后可以访问nacos查看是否注册成功

在这里插入图片描述

3.导入依赖

  • 可以再common功能模块导入此依赖,其他模块未引用时启动项目可能会发生报错,可以排除依赖解决报错
  • 也可以在哪个模块使用,在哪个模块下引入,避免发生不必要的报错


    com.alibaba.cloud
    spring-cloud-alibaba-seata
    2.2.0.RELEASE

4.代理数据源

因为seata需要对数据源进行代理,所以我们需要用seata来封装代理我们的数据源,每个模块都需要写入

  1. @Configuration
  2. public class MySeataConfig {
  3. @Autowired
  4. DataSourceProperties dataSourceProperties;
  5. @Bean
  6. public DataSource dataSource(DataSourceProperties dataSourceProperties){
  7. HikariDataSource dataSource = dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
  8. if(StringUtils.hasText(dataSourceProperties.getName()))
  9. {
  10. dataSource.setPoolName(dataSourceProperties.getName());
  11. }
  12. return new DataSourceProxy(dataSource);
  13. }
  14. }

5.添加配置文件

每个要使用分布式事务的微服务服务中都要添加这两个文件

  • file.conf
  • registry.conf

将Seata的这两个文件复制到项目的resources文件下即可

vgroup_mapping需要修改
举例:
vgroup_mapping.后面追加你的服务名legoumall-ware再加-fescar-service-group

6.添加注解文件

给大事务添加全局注解:@GlobalTransactional
小事务记得也要添加:@Transactional

四、启动项目

报错一

Auto proxy of DataSource can't be enabled as you've created a DataSourceProxy bean.Please consider removing DataSourceProxy bean or disabling auto proxy of DataSource.
发现在seata1.2版本之后就不需要我们手动配置代理数据源了,所以就可以省略第4部

报错二

Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy80 cannot be cast to com.zaxxer.hikari.HikariDataSource

更换一个数据源类型就可以解决启动项目

type: com.mysql.cj.jdbc.MysqlDataSource
在这里插入图片描述

五、结论

使用 Seata 来控制事务,它在执行过程中,首先有几大步,要获取全局锁、还有其它各种锁,要隔离都是要使用各种锁机制。

这样的话,做一个事务的时候,我们会发现它要加超多的锁,一加锁以后,相当于把并发变成串行化了。

这样的话,当系统高并发起来的时候,假设是订单系统,如果都这么做,所有人可能都得等待上一个订单下完,才能下下一个订单,这样整个系统就没法用了。

因为在分布式高并发的情况下,seata的XA模式、2PC 和TCC-事务补偿性方案方法性能欠佳,我们之后会考虑使用MQ的延时队列来完成事务

发表评论

表情:
评论列表 (有 0 条评论,70人围观)

还没有评论,来说两句吧...

相关阅读