单体应用被拆分称微服务应用,原来的三个模块被拆成三个独立的应用,分别使用三个杜伊的数据源,业务操作需要调用三个服务来完成,此时每个服务内部的数据一致性由本地事务来保证,但全局数据一致性问题没办法保证。
image.png

分布式事务处理过程

1+3,1指全局唯一的事务ID(Transaction ID XID),3指三个组件概念,如下

  • 事务协调者(TC):维护全局和分支事务的状态,驱动全局事务提交或回滚
  • 事务管理器(TM):定义全局事务的范围:开始全局事务、提交或回滚全局事务
  • 资源管理器(RM):管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚

通俗解释下图,则TC为授课老师,TM为班主任来协调授课老师和学生,RM为学生,XID为班号
image.png

Seata安装

  • Seata下载地址
  • 解压后修改/conf下的file.conf配置文件,主要修改:自定义事务组名称、事务日志存储模式为db、数据库连接信息。找到service模块修改如下,原来的值是default;找到store模块修改如下,原来的值是file,使用db模式后需要将db中的用户名和密码修改为自己的

image.pngimage.png
image.png

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

image.png

  • 先启动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中的名称一致

image.png

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

image.png
image.png
image.png

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

image.png