在传统的单体项目中,多个不同的业务逻辑使用的都是同一个数据源,使用的都是同一个事务管理器,所以不会存在事务问题。在分布式或者微服务架构中,每个服务都有自己的数据源,使用不同事务管理器,如果A服务去调用B服务,B服务执行失败了,A服务的事务和B服务的事务都会回滚,这时候是不存在事务问题的,但是如果A服务B服务执行成功之后出现异常,A服务的事务会回滚,但是B服务的事务不会回滚,此时就存在分布式事务问题。(在单体的项目中,有多个不同的数据源,每个数据源中都有自己独立的事务管理器,互不影响,那么这时候也会存在多数据源事务管理:解决方案jta+atominc)
问题2、常见的分布式事务解决方案?1、使用MQ2、使用LCN、使用Seata4、2PC、PC
问题、什么是Seata?Seata是阿里巴巴退出的一款用来解决分布式事务问题的框架,他经过天猫双十一的考验,很有可能成为解决分布式事务问题的主流框架
问题4、Seata分布式事务框架实现原理?Seata有三个组成部分:事务协调器TC:协调者、事务管理器TM:发起方、资源管理器RM:参与方(1)发起方会向协调者申请一个全局事务id,并保存到ThreadLocal中(为什么要保存到ThreadLocal中?弱引用,线程之间不会发生数据冲突)(2)Seata数据源代理发起方和参与方的数据源,将前置镜像和后置镜像写入到undo_log表中,方便后期回滚使用()发起方获取全局事务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、TXCSeata实现分布式事务四种方案(模式):AT(几乎等于LCN)TCC、SA、GAXA
2事务简介事务(Transaction)是操作数据库中某个数据项的一个程序执行单元(unit)。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
(1)原子性(atomicity):个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
比方说:买东西要么交钱收货一起都执行,要么发不出货,就退钱
(2)一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一个事务查看数据时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。
如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
()隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
比方说:一个人买东西这个事情,是不影响其他人买东西。
隔离性又分为四个级别:读未提交(readun