本地事务和分布式事务

2023-04-25 10:19:14 浏览数 (1)

本地事务和分布式事务总结

事务概述

问:什么是事务?

答:

代码语言:javascript复制
逻辑上的一组操作,要么同时成功,要么同时失败

问:事务有哪些特性?

答:

代码语言:javascript复制
ACID
    原子性 Atomicity
    一致性 Consistency
    隔离性 Isolation
    持久性 Durable

问:什么是原子性?

答:

代码语言:javascript复制
不可分割的整体,要么同时成功,要么同时失败

问:什么是一致性?

答:

代码语言:javascript复制
数据修改前后,是一致的

问:什么是隔离性?

答:

代码语言:javascript复制
事务间相互不影响

问:什么是持久性?

答:

代码语言:javascript复制
对数据的操作,最终都会持久化到数据库

问:事务有哪些隔离级别?

答:

代码语言:javascript复制
读未提交 脏读、不可重复读、虚读(幻读)
读已提交 不可重复读、虚读(幻读)
可重复读 虚读(幻读)
序列化   无(效率极低-不推荐)

问:读未提交会产生什么问题?

答:

代码语言:javascript复制
脏读、不可重复读、虚读(幻读)

问:什么是脏读?

答:

代码语言:javascript复制
一个事务,读取到另一个事务,未提交的数据

问:什么是不可重复读?

答:

代码语言:javascript复制
一个事务,读取到另一个事务,已经提交的update数据
A
    begin;
    select * from user where id = 1;			第一次结果:1   zhangsan
    update user set name="lisi" where id =1;
    commit;	
B
    begin;
    select * from user where id = 1;     第一次结果:1   zhangsan
    select * from user where id = 1;	 第二次结果:1	 lisi

问:什么是虚读(幻读)?

答:

代码语言:javascript复制
一个事务,读取到另一个事务,已提交的insert数据
A
    begin;
    select * from user;			第一次结果:1   zhangsan	
    insert into user values(2,"lisi");
    commit;		
B	
    begin;
    select * from user;			第一次结果:1   zhangsan	
    select * from user;			第二次结果:1	 zhangsan;2		lisi

Spring事务处理方式

编程式事务处理

代码语言:javascript复制
try{

}catch(){

}finally{

}

声明式事务处理

代码语言:javascript复制
@EnableTransactionManager
@Transactional

问:声明式事务处理原理?

答:

代码语言:javascript复制
AOP面向切面编程

问:AOP底层实现?

答:

代码语言:javascript复制
动态代理

问:动态代理底层实现?

答:

代码语言:javascript复制
反射

问:动态代理具体实现?

代码语言:javascript复制
流行的实现方式:jdk、cglib
AOP相关术语:目标对象、连接点、切入点、通知、切面、织入、代理对象

问:Spring AOP有几种实现方式?

代码语言:javascript复制
jdk(默认)、cglib--切换:proxy-target-class=true

分布式事务

理论基础

CAP

C Consistency 强一致性 A Availability 高可用性 P Partition Tolerance分区容错

BASE

BA 基本可用 S 软状态 E 最终一致

概念

在(分布式)项目中,业务跨多个服务、多个库(数据源),就会存在分布式事务

解决思路

1)把一个分布式事务,看成一个【全局事务】,分布式事务中每个本地事务,都看成【全局事务】一个分支,分支都成功才提交事务,任一失败则回滚。 2)把一个分布式事务,拆分成多个【本地事务】,都成功则成功,任一失败,失败补偿(基于消息的最终一致性)。

分布式事务框架Seata

概念:阿里开源的分布式事务框架

作用:解决分布式事务问题

角色:

代码语言:javascript复制
TC	seata服务端
TM	事务管理器
RM  资源管理

使用步骤:

代码语言:javascript复制
一、搭建事务协调器(seata服务端)
	//...整理笔记(笔记改造成自己的)
	1.选择模式 Nacos
	2.选择数据库 DB
	3.连接Nacos
	4.准备数据库表:全局事务表、分支事务表
二、项目集成Seata(seata客户端)
1)导包
2)配置
	seata相关配置:
		1.seata服务:nacos地址,seata服务名称
		2.工作空间namespace
		3.分组group
		4.集群:配置事务分组,再根据事务分组影射找到集群(拐弯)
3)代码
//...

API

事务管理模式

1)XA(两阶段提交)
代码语言:javascript复制
流程:
    一阶段:
        1.RM注册到TC中
        2.执行SQL,不提交
        3.把事务状态传递给TC
    二阶段:
        1.TC检查各个分支事务状态
        2.提交/回滚
优点:
    1.解决分布式事务问题,保证数据一致性
    2.好多数据库底层支持XA协议,实现简单方便,无代码侵入
缺点:
    1.资源第二阶段才释放,可用性比较低
    2.必须要支持XA协议,才能使用XA模式

2)AT(两阶段提交)
代码语言:javascript复制
流程:
    一阶段:
        1.RM注册到TC中
        2.执行SQL,直接提交
        3.生成undolog快照、生产一个全局锁
        4.把事务状态传递给TC
    二阶段:
        1.TC检查各个分支事务状态
        2.提交-删除快照;回滚-根据快照执行恢复操作、删除快照
优点:
    1.第一阶段直接释放资源,可用性比较高
    2.实现简单方便,无代码侵入
缺点:
    1.一致性降低
    2.回滚时可能会出现异常情况,需要人工干预
注意:
    lock_table-----TC(Seata服务端)
    undo_log-----RM(微服务)

3)TCC(事务补偿机制)
代码语言:javascript复制
流程:
    一阶段:try 资源预留,把资源状态汇报给TC
    二阶段:业务提交,资源扣减
    二阶段:业务回滚,资源回滚
优点:
	效率高、并且保证数据一致
缺点:
    实现复杂
    代码侵入
问题:
    空回滚:cancle 判断【全局事务】状态,如果stats不存在,说明try失败,无须回滚
    业务悬挂:try 判断【全局事务】状态,如果stats为cancle,说明事务已经结束,无须再try

4)SAGA
代码语言:javascript复制
流程:
优点:
缺点:

0 人点赞