springcloud3 分布式事务-产生原因的模拟1

一  分布式事务

1.1 分布式事务产生条件

分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:

1.跨数据源的分布式事务

2.跨服务的分布式事务

3.综合情况

二  案例操作

2.1 原理架构

订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务,可以保证ACID原则。但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是分布式系统下的事务了。

springcloud3 分布式事务-产生原因的模拟1_第1张图片

2.2 工程架构

springcloud3 分布式事务-产生原因的模拟1_第2张图片

2.3 三个服务分别配置配置文件

1.account:  配置的nacos信息 需要在nacos提前配置好

           group: prod_group_ljf
        namespace: 05573840-fcf3-472d-a64a-c66b4fe878f4

server:
  port: 8083
spring:
  application:
    name: account-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: cloudiip
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
        group: prod_group_ljf
        namespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:
  global-config:
    db-config:
      insert-strategy: not_null
      update-strategy: not_null
      id-type: auto
logging:
  level:
    org.springframework.cloud.alibaba.seata.web: debug
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

2.order

server:
  port: 8082
spring:
  application:
    name: order-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: cloudiip
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
        group: prod_group_ljf
        namespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:
  global-config:
    db-config:
      insert-strategy: not_null
      update-strategy: not_null
      id-type: auto
logging:
  level:
    org.springframework.cloud.alibaba.seata.web: debug
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

3.storage

server:
  port: 8080
spring:
  application:
    name: storage-service
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
    username: root
    password: cloudiip
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
        group: prod_group_ljf
        namespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:
  global-config:
    db-config:
      insert-strategy: not_null
      update-strategy: not_null
      id-type: auto
logging:
  level:
    org.springframework.cloud.alibaba.seata.web: debug
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS

2.4 启动nacos

2.5 附件数据库

1.附件sql脚本

springcloud3 分布式事务-产生原因的模拟1_第3张图片

2.如图

springcloud3 分布式事务-产生原因的模拟1_第4张图片

2.6  模拟演示

2.6.1 初始态表中数据

初始化时候各个表的数据:

Order

springcloud3 分布式事务-产生原因的模拟1_第5张图片

Storage

springcloud3 分布式事务-产生原因的模拟1_第6张图片 Account

springcloud3 分布式事务-产生原因的模拟1_第7张图片

2.6.2 正常访问情况

1.使用postman请求: http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=2&money=200

springcloud3 分布式事务-产生原因的模拟1_第8张图片

2.查看各个表的数据

正确访问:均实现正确的扣减,新增操作。

springcloud3 分布式事务-产生原因的模拟1_第9张图片

springcloud3 分布式事务-产生原因的模拟1_第10张图片

2.6.3 异常访问情况

1.库存表storage_tb1 中 count数目还剩8个,

springcloud3 分布式事务-产生原因的模拟1_第11张图片

2.请求设置现在购买数20个大于库存8个,

请求地址:

http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=20&money=200

springcloud3 分布式事务-产生原因的模拟1_第12张图片

3.请求后报错,数据不一致

springcloud3 分布式事务-产生原因的模拟1_第13张图片

账户扣款成功

springcloud3 分布式事务-产生原因的模拟1_第14张图片订单模块报错

springcloud3 分布式事务-产生原因的模拟1_第15张图片

库存模块报错 

springcloud3 分布式事务-产生原因的模拟1_第16张图片查看表:账户表执行扣减操作,money变为600;

springcloud3 分布式事务-产生原因的模拟1_第17张图片

订单表没有发生新增订单记录,

springcloud3 分布式事务-产生原因的模拟1_第18张图片

库存表没有发生,减库存操作。

 测试发现当库存不足时,执行了余额已经扣减,并不会回滚,出现了分布式事务问题。

你可能感兴趣的:(springcloud3,分布式)