问题:每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证.???
一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题.
Seata
是一款开源的分布式事务解决方案,致力于在微服务框架下提供高性能和简单易用的分布式事务.
处理过程:
简单的说,添加一个@GlobalTransactional
注解即可
主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
执行conf下的sql文件
目的是:指明注册中心时nacos,以及修改nacos连接信息
业务说明:当用户下单时,会在订单服务中创建一个订单,然后通过远程调用库存服务来扣减下单商品的库存,再通过远程调用账户开扣减用户账户里面的余额,最后在订单服务中修改订单状态为已完成.----该操作跨越三个数据库,有两次远程调用,很明显会有分布式事务问题.
下订单 —>扣库存---->减账户(余额)
分别创建3个数据库
三个库下都需要建各自的回滚日志表
在seata/conf目录下有db_undo_log.sql
文件,在每个库下分别执行一次;
业务需求:下订单>>减库存>>扣余额>>改(订单)状态
1️⃣.在pom文件中添加依赖,由于seata需要与本地的seata版本一致,引入seata时它会自带一个版本,所以需要先踢掉,手动引入与本地版本一致的seata.
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-seataartifactId>
<exclusions>
<exclusion>
<artifactId>seata-allartifactId>
<groupId>io.seatagroupId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>io.seatagroupId>
<artifactId>seata-allartifactId>
<version>0.9.0version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.37version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.10version>
dependency>
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
<version>2.0.0version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
dependencies>
以上是SpringCloud alibaba的依赖
2️⃣.application.yml
server:
port: 2001
spring:
application:
name: seata-order-service
cloud:
alibaba:
seata:
#自定义事务组名称需要与seata-server中的对应
tx-service-group: fsp_tx_group
nacos:
discovery:
server-addr: localhost:8848
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/seata_order
username: root
password: 123456
feign:
hystrix:
enabled: false
logging:
level:
io:
seata: info
mybatis:
mapperLocations: classpath:mapper/*.xml
3️⃣.file.conf