本地事务和分布式事务
2023-06-13 09:18:51 时间
本地事务和分布式事务总结
事务概述
问:什么是事务?
答:
逻辑上的一组操作,要么同时成功,要么同时失败
问:事务有哪些特性?
答:
ACID
原子性 Atomicity
一致性 Consistency
隔离性 Isolation
持久性 Durable
问:什么是原子性?
答:
不可分割的整体,要么同时成功,要么同时失败
问:什么是一致性?
答:
数据修改前后,是一致的
问:什么是隔离性?
答:
事务间相互不影响
问:什么是持久性?
答:
对数据的操作,最终都会持久化到数据库
问:事务有哪些隔离级别?
答:
读未提交 脏读、不可重复读、虚读(幻读)
读已提交 不可重复读、虚读(幻读)
可重复读 虚读(幻读)
序列化 无(效率极低-不推荐)
问:读未提交会产生什么问题?
答:
脏读、不可重复读、虚读(幻读)
问:什么是脏读?
答:
一个事务,读取到另一个事务,未提交的数据
问:什么是不可重复读?
答:
一个事务,读取到另一个事务,已经提交的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
问:什么是虚读(幻读)?
答:
一个事务,读取到另一个事务,已提交的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事务处理方式
编程式事务处理
try{
}catch(){
}finally{
}
声明式事务处理
@EnableTransactionManager
@Transactional
问:声明式事务处理原理?
答:
AOP面向切面编程
问:AOP底层实现?
答:
动态代理
问:动态代理底层实现?
答:
反射
问:动态代理具体实现?
流行的实现方式:jdk、cglib
AOP相关术语:目标对象、连接点、切入点、通知、切面、织入、代理对象
问:Spring AOP有几种实现方式?
jdk(默认)、cglib--切换:proxy-target-class=true
分布式事务
理论基础
CAP
C Consistency 强一致性 A Availability 高可用性 P Partition Tolerance分区容错
BASE
BA 基本可用 S 软状态 E 最终一致
概念
在(分布式)项目中,业务跨多个服务、多个库(数据源),就会存在分布式事务
解决思路
1)把一个分布式事务,看成一个【全局事务】,分布式事务中每个本地事务,都看成【全局事务】一个分支,分支都成功才提交事务,任一失败则回滚。 2)把一个分布式事务,拆分成多个【本地事务】,都成功则成功,任一失败,失败补偿(基于消息的最终一致性)。
分布式事务框架Seata
概念:阿里开源的分布式事务框架
作用:解决分布式事务问题
角色:
TC seata服务端
TM 事务管理器
RM 资源管理
使用步骤:
一、搭建事务协调器(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(两阶段提交)
流程:
一阶段:
1.RM注册到TC中
2.执行SQL,不提交
3.把事务状态传递给TC
二阶段:
1.TC检查各个分支事务状态
2.提交/回滚
优点:
1.解决分布式事务问题,保证数据一致性
2.好多数据库底层支持XA协议,实现简单方便,无代码侵入
缺点:
1.资源第二阶段才释放,可用性比较低
2.必须要支持XA协议,才能使用XA模式
2)AT(两阶段提交)
流程:
一阶段:
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(事务补偿机制)
流程:
一阶段:try 资源预留,把资源状态汇报给TC
二阶段:业务提交,资源扣减
二阶段:业务回滚,资源回滚
优点:
效率高、并且保证数据一致
缺点:
实现复杂
代码侵入
问题:
空回滚:cancle 判断【全局事务】状态,如果stats不存在,说明try失败,无须回滚
业务悬挂:try 判断【全局事务】状态,如果stats为cancle,说明事务已经结束,无须再try
4)SAGA
流程:
优点:
缺点:
相关文章
- 10年架构师竟然被这题拒绝:谈谈分布式事务的3种解决方案
- 分布式事务TCC框架-hmily(spring cloud feign)
- 基于Hmily实现TCC分布式事务解决方案[通俗易懂]
- 【第十九篇】商城系统-分布式事务解决方案
- 面试突击87:说一下 Spring 事务传播机制?
- 【分布式事务】GitHub上分布式事务框架压测性能对比
- 分布式事务saga开源实现_spring分布式事务解决方案
- 分布式事务专题
- Postgresql源码(93)Postgresql函数内事务控制实现原理(附带Oracle对比)
- 多数据源事务处理-涉及分布式事务
- 分布式事务 | 使用 dotnetcore/CAP 的本地消息表模式
- 分布式事务之TCC与SAGA
- MySql中innodb存储引擎事务日志详解数据库
- 处理Mysql C中事务处理技术的研究(mysqlc事务)
- MongoDB 4.2 正式发布 引入分布式事务
- MySQL事务:四大性质保证数据安全(mysql事务的四大特性)
- 分布式事务实现分布式事务:用Redis锁制胜(redis锁实现)
- 解密分布式事务锁技术:MySQL的应用与优势(分布式事务锁mysql)
- MySQL中事务保证数据一致性的关键(mysql 中事务)
- 事务操作,实现高效数据库操作(mysql一次提交多个)
- 利用事务在mysql中操作两张表(mysql两张表 事务)
- 分布式事务锁的实现Redis实践(分布式事务锁 redis)
- 实现零延迟的分布式Redis事务(分布式redis事务)
- 深入理解Oracle事务的用法(oracle事物用法)
- 事务Oracle中如何正确提交事务(oracle中提交)
- Oracle TX锁解决数据库事务竞争的场景(oracle tx锁场景)