前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >本地事务和分布式事务

本地事务和分布式事务

原创
作者头像
java小黑
修改2023-04-25 10:19:14
8320
修改2023-04-25 10:19:14
举报
文章被收录于专栏:加哇

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

事务概述

问:什么是事务?

答:

代码语言: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
复制
流程:
优点:
缺点:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本地事务和分布式事务总结
    • 事务概述
      • Spring事务处理方式
        • 编程式事务处理
        • 声明式事务处理
      • 分布式事务
        • 理论基础
        • 概念
        • 解决思路
      • 分布式事务框架Seata
        • 概念:阿里开源的分布式事务框架
        • 作用:解决分布式事务问题
        • 角色:
        • 使用步骤:
        • API
    相关产品与服务
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档