【商城实战】11-进阶篇-分布式事务
【商城实战】11-进阶篇-分布式事务
Last edited 2022-9-27
date
Jul 7, 2022
type
Post
status
Published
slug
msb-mac-mall-distributed-transactions
summary
概要:1 介绍本地事务;2 分布式事务概念;3 分布式事务解决方案;4 seata实现分布式事务实战;
tags
微服务
spring-cloud-alibaba
商城
category
商城实战
password
Property
Sep 27, 2022 02:57 AM
icon

分布式事务

一、为什么需要使用分布式事务

我们在分布式环境下一个业务可能会涉及到多个模块之间的调用,为了保证操作的原子性,分布式事务是最好的解决方案。
notion image

二、本地事务

在系统介绍分布式事务之前,我们还是很有必要回顾下本地事务。在一个服务中生效的事务我们称为本地事务。

1. 事务的特性

事务的概念:事务是逻辑上一组操作,组成这组操作各个逻辑单元,要么一起成功,要么一起失败。
事务的四个特性(ACID):
  1. 原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。
  1. 一致性(consistency):一致指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
  1. 隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰
  1. 持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

2. 事务的隔离级别

事务并发引起一些读的问题:
  • 脏读 一个事务可以读取另一个事务未提交的数据
  • 不可重复读 一个事务可以读取另一个事务已提交的数据 单条记录前后不匹配
  • 虚读(幻读) 一个事务可以读取另一个事务已提交的数据 读取的数据前后多了点或者少了点
并发写:使用mysql默认的锁机制(独占锁)
解决读问题:设置事务隔离级别
  • read uncommitted(0)
  • read committed(2)
  • repeatable read(4)
  • Serializable(8)
隔离级别越高,性能越低。
notion image
一般情况下:脏读是不可允许的,不可重复读和幻读是可以被适当允许的。

3. Spring事务的传播属性

 
 

三、分布式事务

 
  • 微服务
  • spring-cloud-alibaba
  • 商城
  • 【商城实战】12-进阶篇-秒杀服务【商城实战】06-进阶篇-异步处理