单体应用被拆分称微服务应用,原来的三个模块被拆成三个独立的应用,分别使用三个杜伊的数据源,业务操作需要调用三个服务来完成,此时每个服务内部的数据一致性由本地事务来保证,但全局数据一致性问题没办法保证。
分布式事务处理过程
1+3,1指全局唯一的事务ID(Transaction ID XID),3指三个组件概念,如下
- 事务协调者(TC):维护全局和分支事务的状态,驱动全局事务提交或回滚
- 事务管理器(TM):定义全局事务的范围:开始全局事务、提交或回滚全局事务
- 资源管理器(RM):管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
通俗解释下图,则TC为授课老师,TM为班主任来协调授课老师和学生,RM为学生,XID为班号
Seata安装
- Seata下载地址
- 解压后修改/conf下的file.conf配置文件,主要修改:自定义事务组名称、事务日志存储模式为db、数据库连接信息。找到service模块修改如下,原来的值是default;找到store模块修改如下,原来的值是file,使用db模式后需要将db中的用户名和密码修改为自己的



- 数据库新建seata数据库
- 在seata中创建表,其sql语句在/conf的db_store.sql中
- 修改/conf中的registry.conf配置文件,目的是指明注册中心为nacos,以及修改nacos连接信息

先启动Nacos端口号8848,再启动seata-server
Seate使用
pom引入spring-cloud-starter-alibaba-seata、spring-cloud-starter-openfeign、spring-cloud-starter-alibaba-nacos-discovery
- yml配置如下,事务组名与配置seata时修改的file.conf中的名称一致

- 在yml同目录下增加file.conf和registry.conf,file.conf这两处需要修改为本机相应的值,registry.conf需要修改两处为nacos及相应的端口



- 创建表相应的实体类,编写相应的业务类
- 主启动类在@SpringBootApplication后增加exclude = DataSourceAutoConfiguration.class参数来取消数据源的自动创建,使用Seata对数据源进行代理
- 在一个微服务调用其他微服务时,需要进行全局事务回归,因此在调用其他微服务的业务类中需要增加@GlobalTransactional注解,name参数为唯一名称,rollbackFor参数用来设定异常级别,下图是将所有异常回滚,解决不同数据库的分布式事务问题

