分布式事务解决方案
分布式事务解决方案
1、本地事务
事务的四大特性
原子性
一致性
隔离性
持久性
而其中原子性、隔离性、持久性数据库可以完成,而原子性和持久性则是通过undo和redo日志来实现
undo和redo mysql中与事务有关的日志
undo Log:
redo Log:
原本试讲undo log写入磁盘,但是实际上试讲undo log写入redo log,从而充分发挥redo log的优势(写入磁盘的方式是顺序写)
分布式事务
如何解决分布式事务
CAP定理
2、两阶段提交
用户请求请求我们微服务,微服务调用哪个其他微服务时,当牵扯数据库操作时,由我们的事务协调器(事务管理器)先进性预提交(此时是占用数据库数据资源),当所有的操作(sql)都正常执行,
在进行真正的提交,中间有一个过程出错,所有的执行回滚操作。从而实现分布式事务,所有的分布式事务都无法保证100%的一致,并且允许柔性事务。
3、TCC
try confirm cancel
4、可靠消息服务
1、必须保证消息的可靠
2、无法回滚成功服务的事务
为了保证消息的可靠,引入本地消息表,通过本地消息表和定时任务去保证消息可靠
5、AT模式
第一阶段与TCC模式一样,每个服务单独执行事务,事务执行成功后直接提交,而当某一个服务出现失败,由框架执行补偿操作,TCC是人为去进行补偿操作,而且没有try的过程直接写业务,操作数据库
一阶段:
二阶段:会获取所有阶段一的返回结果,如果都成功,清空阶段一生成的两个日志,如果有失败的便获取before imag中的数据进行回滚,在这之前先通过after imag去进行比对现在的数据是否是执行修改后的数据,
一旦不一致说明出现脏数据,需要人工干预
1、搭建TC服务
解压后的目录结构
解压后需要配置两个配置文件,registry.conf 和 file.conf
registry.conf
注册中心,TC需要将自己注册到我们的注册中心中
配置中心
file.conf
1、配置TC的信息往哪存(两种方式file 或 db)
2、所有服务参与者引入RM TM
事务的发起者也就是我们服务调用方进行如下操作
(1)导入相关的依赖
(2)添加配置文件
配置一个事务组
(3)项目中添加两个文件 file.conf registry.conf
file.conf
其中vgroupMapping中与版本有关,可能是vgroupMapping或者vgroup_mapping
这是file的核心配置,其中mapping.test_tx_group是我们配置文件配置内容,seata_tc_server是我们配置中心TC的实例名,从而可以获取到我们Tc
registry.conf
基本与TC配置一样
(4)代理DataSource
(5)添加事务注解
事务的参与者与发起者几乎相同,少了一步开启事务组注解,只需要添加本地事务