Seata(Java面试题)

1、分布式事务产生的背景?

在传统的单体项目中,多个不同的业务逻辑使用的都是同一个数据源,使用的都是同一个事务管理器,所以不会存在事务问题。
在分布式或者微服务架构中,每个服务都有自己的数据源,使用不同事务管理器,如果A服务去调用B服务,B服务执行失败了,A服务的事务和B服务的事务都会回滚,这时候是不存在事务问题的,但是如果A服务B服务执行成功之后出现异常,A服务的事务会回滚,但是B服务的事务不会回滚,此时就存在分布式事务问题。
(在单体的项目中,有多个不同的数据源,每个数据源中都有自己独立的事务管理器,互不影响,那么这时候也会存在多数据源事务管理:解决方案jta+ atominc)

2、常见的分布式事务解决方案?

1、使用MQ
2、使用LCN
3、使用Seata

3、什么是Seata?

Seata是阿里巴巴退出的一款用来解决分布式事务问题的框架,他经过天猫双十一的考验,很有可能成为解决分布式事务问题的主流框架

4、Seata分布式事务框架实现原理?

Seata有三个组成部分:事务协调器TC:协调者、事务管理器TM:发起方、资源管理器RM:参与方
(1)发起方会向协调者申请一个全局事务id,并保存到ThreadLocal中(为什么要保存到ThreadLocal中?弱引用,线程之间不会发生数据冲突)
(2)Seata数据源代理发起方和参与方的数据源,将前置镜像和后置镜像写入到undo_log表中,方便后期回滚使用
(3)发起方获取全局事务id,通过改写Feign客户端请求头传入全局事务id。
(4)参与方从请求头中获取全局事务id保存到ThreadLocal中,并把该分支注册到SeataServer中。
(5)如果没有出现异常,发起方会通知协调者,协调者通知所有分支,通过全局事务id和本地事务id删除undo_log数据,如果出现异常,通过undo_log逆向生成sql语句并执行,然后删除undo_log语句。如果处理业务逻辑代码超时,也会回滚。

5、SpringBoot如何整合Seata?

一般情况下,学一个知识不需要去学API,学的主要是思想,API会发生变化,思想几乎是不会变的
第一步:引入依赖
第二步:bin下的file文件和registry文件放入到每个项目中,并修改,分组名称要保持一致
第三步:yml配置seata
第四步:引入DataSourceProxy配置文件

6、Seata和LCN的区别?

Seata和LCN的思想是一样的,只不过LCN中采用的是假关闭,不会提交或者回滚事务,而Seata中是直接插入数据。两者的区别就是当发起方突然宕机了,LCN会发生死锁,而Seata不会,但是Seata会引起脏读。
LCN实现分布式事务三种方案(模式):LCN、TCC、TXC
Seata实现分布式事务四种方案(模式):AT(几乎等于LCN)TCC、SA、GAXA