springcloud3 无分布式事务造成数据不一致场景模拟1

本文详细介绍了分布式事务的产生条件,涉及跨数据源和跨服务场景,通过订单创建案例展示了如何在微服务架构中配置和实现分布式事务,以及遇到的问题,如库存不足时的事务一致性问题。

一  分布式事务

1.1 分布式事务产生条件

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

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

2.跨服务的分布式事务

3.综合情况

二  案例操作

2.1 原理架构

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

2.2 工程架构

1.工程架构:

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

2.3.1 naocs的配置

2.3.2  相应的配置文件 

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脚本

2.附加成功,查看截图

2.6  模拟演示

2.6.1 初始态表中数据

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

Order表

Storage表

 Account表

2.6.2 正常访问情况

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

2.查看各个表的数据

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

2.6.3 异常访问情况

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

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

请求地址:

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

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

1.账户扣款成功

2.订单模块报错

3.库存模块报错 

查看表:账户表执行扣减操作,money变为600;

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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值