分布式事务解决方案-Seata

Seata

一、什么是Seata

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

使用seata的原因

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

二、工作流程

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

三、使用Seata

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

1.添加 undo_log 表

每一个要使用分布式事务的数据库都需要一个 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配置文件

  • 我们这里使用的是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.cloudspring-cloud-alibaba-seata2.2.0.RELEASE

4.代理数据源

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

@Configuration
public class MySeataConfig {@AutowiredDataSourceProperties dataSourceProperties;@Beanpublic 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.添加配置文件

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

  • 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的延时队列来完成事务


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部