1.什么是事务
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。
2.事务的ACID 特性
2.1.原子性
即不可分割性,事务要么全部被执行,要么就全部不被执行。
2. 2. 一致性或可串性
事务的执行使得数据库从一种正确状态转换成另一种 正确状态
2.3. 隔离性
在事务正确提交之前,不允许把该事务对数据的任何改变提供 给任何其他事务
2.4. 持久性
事务正确提交后,其结果将永久保存在数据库中,即使在事务 提交后有了其它故障,事务的处理结果也会得到保存
3.事务并发带来的问题
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来 完成各自的任务(多个用户对同一 数据进行操作).并发虽然是必须的, 但可能会导致以下的问题。
3.1. 脏读 (Dirty read)
当一个事务正在访问数据并且对数据进行了修改, 而这种修改还没有提交到数据库中,这时另外一个事务也访问了这 个数 据,然后使用了这个数据.因为这个数据是还没有提交的数据,那么另 外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能 是不正确的。
3.2.丢失修改(Lost to modify)
指在一个事务读取一个数据时,另外一 个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第 二 个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因 此称为丢失修改。
3.3. 不可重复读(Unrepeatableread)
指在一个事务内多次读同一数据。 在这个事务还没有结束时,另一个事务也访问该数据。那么,在第 一个 事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次 读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是 不一样的情况,因此称为不可重复读。
3.4.幻读(Phantom read)
幻读与不可重复读类似。它发生在一个事务
( T1)读取了几行数据,接着另一个并发事务( T2)插入了一些数据 时。在随后的查询中,第一个事务( T1)就会发现多了一些原本不存在 的记录,就好像发生了幻觉一样,所以称为幻读。
3.5. 不可重复读和幻读区别
不可重复读的重点是修改,比如多次读取一 条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如 多次读取一条记录发现记录 增多或减少了
4.事务的隔离级别
4.1.READ-UNCOMMITTED( 读取未提交 )
最低的隔离级别,允许读取尚未提交 的数据变更,可能会导致脏读、幻读或不可重复读。
4.2.READ-COMMITTED( 读取已提交 )
允许读取并发事务已经提交的数据,可 以阻止脏读,但是幻读或不可重复读仍有可能发生。
4.3.REPEATABLE-READ( 可重复读 )
对同一字段的多次读取结果都是一致 的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻 读仍有可能发生。
4.4.SERIALIZABLE( 可串行化 )
最高的隔离级别,完全服从 ACID 的隔离级 别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就 是说,该级别可以防止脏读、不可重复读以及幻读。
5.什么是分布式事务
分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性
6.为什么使用分布式事务
7.如何解决分布式事务的问题
使用消息中间件
手写代码解决分布式事务
使用第三方组件--->Seata阿里巴巴的产品
8.seata
8.1.什么是seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
8.2.Seata的执行流程
1.A服务【订单微服务】的TM[事务发起者]向TC[seata服务端]申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID
2.A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播
3.B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
4.B服务执行分支事务,向数据库做操作
5.全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚
6.TC协调其管辖之下的所有分支事务, 决定是否回滚
TM:事务发起者【在哪个方法上添加了全局事务注解的】
TC : 事务管理器【seata的服务端】
RM: 每个操作数据库的微服务
TID: 全局事务id
TM和RM都属于微服务代码
TC: seata服务器。
9.搭建seata服务器
9.1.查看版本--版本要对应
9.2.下载seata1.3.0
因为我springcloud使用的是2.2.3
找对应的版本
9.3.解压
9.4.修改conf/file.conf
seata默认保存到本地中,以后会有seata集群,得让seata信息可以共享,我们应该修改它的保存位置:
serverTimezone这个是正确的
9.5.拉取mysql的驱动
9.6.创建数据库并导入表结构
可以直接下载将scipt放到senta中
9.7.指定seata的注册中心地址和配置中心的内容
9.8.需要把哪些配置项放入nacos配置中心
9.8.1.修改储存方式
9.8.2.修改自己的MySQL
注意里面的serverTimezone这个是正确的
9.8.3.修改组名
9.9.使用nacos/nacos-fonfig.sh 把配置信息放入nacos配置中心
使用git打开nacos-config.sh
9.10.指定nacos配置中心的地址
9.11.访问一下自己nacos
10.配置微服务客户端
10.1.在每个数据库中创建unlog表
10.2.在每个微服务中添加seata依赖
<!--seata 一定要保证和seata服务的版本匹配-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
10.2.1.查看一下自己的版本
10.3.修改每个微服务的配置文件
#指定seata分组名称--组名必须和config.txt文件中的分组名字一致
alibaba:
seata:
tx-service-group: guangzhou
#指定seata服务器在nacos的注册中心的地址
seata:
registry:
#类型是nacos
type: nacos
#指定nacos的地址
nacos:
server-addr: localhost:8848
#指定nacos的账号和密码
username: nacos
password: nacos
#组名--默认是SEATA_GROUP--可以不写
group: DEFAULT_GROUP
#指定seata服务器在注册中心的服务名称--默认seata-server
application: seata-storage
#指定配置的类型--配置中心
config:
type: nacos
nacos:
server-addr: localhost:8848
username: nacos
password: nacos
group: SEATA_GROUP