分布式事务⾯试题
分布式事务笔记
⼀、什么是事务,本地事务,分布式事务
事务:提供⼀种机制将⼀个活动涉及的所有操作纳⼊到⼀个不可分割的执⾏单元,组成事务的所有操作只有在所有操作均能正常执⾏的情况下⽅能提交,只要其中任⼀操作执⾏失败,都将导致整个事务的回滚。
本地事务:⼜叫数据库事务,是基于单个服务单⼀数据库资源访问的事务。
分布式事务:指⼀次⼤的操作由不同的⼩操作组成的,这些⼩的操作分布在不同的服务器上,分布式事务需要保证这些⼩操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据⼀致性。
⼆、事务特性(ACID)
事务满⾜ACID特性:
A:原⼦性(Atomicity)
⼀个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
C:⼀致性(Consistency)
事务的⼀致性指的是在⼀个事务执⾏之前和执⾏之后数据都是正确的,数据库都必须处于⼀致性状态。
I:隔离性(Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各⾃的完整数据空间。
D:持久性(Durability)
指的是只要事务成功结束,它对数据库所做的更新就必须保存下来,不会因各种系统错误或其他意外情况⽽受到影响
三、事务的隔离级别
1.并发读问题
脏读:⼀个事务可以读取另⼀个事务未提交的数据
不可重复读:⼀个事务可以读取另⼀个事务已修改的数据 ,单条记录前后不匹配
虚读(幻读):⼀个事务可以读取另⼀个事务已增删的数据,多条记录前后不匹配
2.并发写问题
并发写:使⽤mysql默认的锁机制(独占锁)
basked3.解决读问题:设置事务隔离级别
隔离级别脏读不可重复读幻读
读未提交√√√
读已提交×√√
可重复读××√
可串⾏化×××
⼀般情况下:脏读是不可允许的,不可重复读和幻读是可以被适当允许的,隔离级别越⾼,性能越低。
四、事务的传播⾏为
REQUIRED⽀持当前事务,如果不存在,就新建⼀个
excel中的mid函数SUPPORTS⽀持当前事务,如果不存在,就不使⽤事务
后端工程师是程序员吗MANDATORY⽀持当前事务,如果不存在,抛出异常
REQUIRES_NEW如果有事务存在,挂起当前事务,创建⼀个新的事务
NOT_SUPPORTED以⾮事务⽅式运⾏,如果有事务存在,挂起当前事务
NEVER以⾮事务⽅式运⾏,如果有事务存在,抛出异常
nutz和springbootNESTED如果当前事务不存在,就新建⼀个事务运⾏,如果存在,则嵌套事务执⾏
五、分布式事务的 CAP 定理
Consistency(⼀致性):在分布式系统中的所有数据备份,在同⼀时刻是否同样的值。
Availability(可⽤性):在集中⼀部分节点故障后,集整体是否还能响应客户端的读写请求。
Partition tolerance(分区容忍性):⼤多数分布式系统都分布在多个⼦⽹络。每个⼦⽹络就叫做⼀个区(partition)。分区容错的意思是,区间通信可能失败。
CAP理论就是说在分布式存储系统中,最多只能实现上⾯的两点。⽽由于当前的⽹络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们⽆法避免的。所以我们只能在⼀致性和可⽤性之间进⾏权衡,没有系统能同时保证这三点。要么选择CP、要么选择AP。
六、分布式事务解决⽅案
1.2PC:
2:两个阶段
P:Prepare预提交阶段
C:Commit提交阶段
基于2PC的XA协议,⽬前主流的数据库都⽀持了,免费开源的⽀持的不够好。
url码转换优点:实现简单
缺点:
1. mysql⽀持的不够完善
2. 由于需要多次⽹络传输,导致锁定资源的时间变长了,最终性能不⾼
2.TCC:补偿性事务解决⽅案。编程式分布式事务解决⽅案
T:Try,预检资源并锁定资源
C:Confirm,执⾏业务操作
C:Cancel,取消或者回滚事务
缺点:
1. 代码量⾮常庞⼤
2. 在业务逻辑复杂的情况下,很难把握补偿点
3. 幂等性很难保证
3.MQ最终⼀致性
mysql面试题常问可靠性较差
性能较⾼
七、分布式事务框架-seata
1.Seata 的3个基本组件
Transaction Coordinator(TC):事务协调器,维护全局事务的运⾏状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager(TM):事务管理器,控制全局事务的边界,负责开启⼀个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager(RM):资源管理器,控制分⽀事务,负责分⽀注册、状态汇报,并接收事务协调器的指令,驱动分⽀(本地)事务的提交和回滚。
2.Seata 的⽣命周期:
TM 向 TC 申请开启⼀个全局事务,全局事务创建成功并⽣成⼀个全局唯⼀的 XID。
XID 在微服务调⽤链路的上下⽂中传播。
RM 向 TC 注册分⽀事务,将其纳⼊ XID 对应全局事务的管辖。
TM 向 TC 发起针对 XID 的全局提交或回滚决议。
TC 调度 XID 下管辖的全部分⽀事务完成提交或回滚请求。
3.Seata 的使⽤步骤
第⼀步修改 seatea下的 f 配置⽂件,启动 seata-server
第⼆步数据库中涉及的业务表添加 undo_log ⽇志表
第三步引⼊seata 的依赖
第四步添加配置⽂件 f 并修改、添加配置⽂件 f 并修改
第五步添加 DataSourceConfig 配置类,需要将 DataSourceProxy 设置为主数据源,否则事务⽆法回滚
第六步主业务⽅法上加 @GlobalTransactional
第七步其他普通业务⽅法加 @Transactional
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论