一 分布式事务
1.1 分布式事务产生条件
分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:
1.跨数据源的分布式事务
2.跨服务的分布式事务
3.综合情况
二 案例操作
2.1 原理架构
订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务,可以保证ACID原则。但是当我们把三件事情看做一个"业务",要满足保证“业务”的原子性,要么所有操作全部成功,要么全部失败,不允许出现部分成功部分失败的现象,这就是分布式系统下的事务了。
2.2 工程架构
2.3 三个服务分别配置配置文件
1.account: 配置的nacos信息 需要在nacos提前配置好
group: prod_group_ljf
namespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
server:port: 8083
spring:application:name: account-servicedatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=falseusername: rootpassword: cloudiipcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址group: prod_group_ljfnamespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:global-config:db-config:insert-strategy: not_nullupdate-strategy: not_nullid-type: auto
logging:level:org.springframework.cloud.alibaba.seata.web: debugcn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
2.order
server:port: 8082
spring:application:name: order-servicedatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=falseusername: rootpassword: cloudiipcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址group: prod_group_ljfnamespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:global-config:db-config:insert-strategy: not_nullupdate-strategy: not_nullid-type: auto
logging:level:org.springframework.cloud.alibaba.seata.web: debugcn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
3.storage
server:port: 8080
spring:application:name: storage-servicedatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///seata_demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=falseusername: rootpassword: cloudiipcloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址group: prod_group_ljfnamespace: 05573840-fcf3-472d-a64a-c66b4fe878f4
mybatis-plus:global-config:db-config:insert-strategy: not_nullupdate-strategy: not_nullid-type: auto
logging:level:org.springframework.cloud.alibaba.seata.web: debugcn.itcast: debugpattern: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.请求后报错,数据不一致
账户扣款成功
订单模块报错
库存模块报错
查看表:账户表执行扣减操作,money变为600;
订单表没有发生新增订单记录,
库存表没有发生,减库存操作。
测试发现:当库存不足时,执行了余额已经扣减,并不会回滚,出现了分布式事务问题。