一 分布式事务
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-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.请求后报错,数据不一致
账户扣款成功
订单模块报错
库存模块报错
查看表:账户表执行扣减操作,money变为600;
订单表没有发生新增订单记录,
库存表没有发生,减库存操作。
测试发现:当库存不足时,执行了余额已经扣减,并不会回滚,出现了分布式事务问题。