1.版本说明
- 注册配置中心为Nacos,官网快速搭建指引:https://nacos.io/zh-cn/docs/quick-start.html
- Seata版本:1.4.2,官网地址:https://seata.io/zh-cn/
2.搭建Seata服务端
-
下载Seata-Server,地址:https://github.com/seata/seata/releases
点击对应版本,拉取到页面底端,下载红框中的压缩包
-
修改配置文件
这里提供一个小建议,修改Seata配置文件之前,先在nacos上新建一个命名空间,理由是seata会产生一些配置文件,如果没有指定命名空间,默认是public,会让你的配置列表看起来相当杂乱,当然这步并不是必须得,你可以跳过它,但它会让你的配置列表更整洁。
可以按照图中红色步骤添加;也可以看到图中蓝色框中的配置数,如果不指定你得列表肯定会很凌乱,如果你也集成了dubbo也建议这么做,做完此步骤需要记录下生成好的命名空间ID。回到正题,首先解压下载好的 seata-server-1.4.2.zip,目录如下:
进入 conf/ 目录下,修改配置文件(file.conf,registy.conf)- file.conf 修改(建议先备一份),一共有三个模式可选,(FILE,DB,REDIS)我这里演示的是使用DB模式,先建立一个seata库
- registry.conf 文件修改
如果为seata新建立了命名空间的话,将namespace的值修改成自己的命名空间ID
- file.conf 修改(建议先备一份),一共有三个模式可选,(FILE,DB,REDIS)我这里演示的是使用DB模式,先建立一个seata库
-
启动测试,进入bin目录
Windows的话直接双击seata-server.bat启动 端口号为 8091
Linux的话可以使用该命令nohup sh seata-server.sh -h 服务器IP -p 自定义端口号 > catalina.out 2>&1 &
启动后在nacos的服务列表中,可以看到seata-server服务,则表示启动成功,
注意,如果你指定了命名空间的话请先在上方选择命名空间
3.将配置导入nacos配置中心
-
将seata-1.4.2.zip解压,不带server的解压包
进入 seata-1.4.2\script\config-center目录 -
修改config.txt文件
修改db的url,user,password -
进入nacos目录,我是windows系统,有git,就简单里了,直接在目录右键打开Git Base Here
运行命令:sh nacos-config.sh -h XXX.XXX.XXX.XXX -p 8848 -g SEATA_GROUP -t 29bc9448-ac49-499f-a129-808a4758ecaa -u nacos -w nacos
-h:nacos地址
-p: 端口,默认8848
-g: seata的服务列表分组名称
-t : 命名空间id
-u和-w:用户名和密码执行完成之后在nacos配置列表的seata命名空间下就多出很多的seata自己的配置了
4.导入数据库脚本
- 导入server的数据库脚本,打开目录 seata-1.4.2\script\server\db
在前边配置的数据库url的那个库执行sql
执行完会有三个表 - 导入client的数据库脚本,打开目录 seata-1.4.2\script\client\at\db
客户端的需要在你的业务库执行
比如我在我的用户库导入了脚本,生成了undo_log
至此,我们的seata-server
5.看一下运行测试的效果
- 添加maven依赖
<!--分布式事务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <exclusion> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.4.2</version> </dependency>
- 添加配置文件
spring: application: name: service-user seata: enabled: true enable-auto-data-source-proxy: true tx-service-group: my_test_tx_group registry: type: nacos nacos: application: seata-server server-addr: nacos的地址 group: SEATA_GROUP username: nacos password: nacos config: type: nacos nacos: server-addr: nacos的地址 group: SEATA_GROUP username: nacos password: nacos namespace: nacos的seata的地址 service: vgroup-mapping: my_video_group: default disable-global-transaction: false client: rm: report-success-enable: false
- 测试代码
根据我的传值来设置抛异常的位置@GlobalTransactional(rollbackFor = {Exception.class},timeoutMills = 6000,name = "testTran") public void testSeata(Integer num) throws HelpCustomizeExcepetion { //更新need Need need = new Need(); need.setId(1); need.setNeedTitle("666"); updateById(need); //更新User User user = new User(); user.setId(1); user.setUserName("666"); userService.updateById(user); if(num == 1){ int a = 1/0; } //更新 system System system = new System(); system.setId(1); system.setName("666"); systemService.updateById(system); if(num == 2){ int b = 1/0; } }
首先传num=0
数据库都更新成功
传传num=2
抛出异常,数据库数据未发生改变,回滚成功