问:什么是事务?
答:
逻辑上的一组操作,要么同时成功,要么同时失败
问:事务有哪些特性?
答:
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
try{
}catch(){
}finally{
}
@EnableTransactionManager
@Transactional
问:声明式事务处理原理?
答:
AOP面向切面编程
问:AOP底层实现?
答:
动态代理
问:动态代理底层实现?
答:
反射
问:动态代理具体实现?
流行的实现方式:jdk、cglib
AOP相关术语:目标对象、连接点、切入点、通知、切面、织入、代理对象
问:Spring AOP有几种实现方式?
jdk(默认)、cglib--切换:proxy-target-class=true
C Consistency 强一致性 A Availability 高可用性 P Partition Tolerance分区容错
BA 基本可用 S 软状态 E 最终一致
在(分布式)项目中,业务跨多个服务、多个库(数据源),就会存在分布式事务
1)把一个分布式事务,看成一个【全局事务】,分布式事务中每个本地事务,都看成【全局事务】一个分支,分支都成功才提交事务,任一失败则回滚。 2)把一个分布式事务,拆分成多个【本地事务】,都成功则成功,任一失败,失败补偿(基于消息的最终一致性)。
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)代码
//...
流程:
一阶段:
1.RM注册到TC中
2.执行SQL,不提交
3.把事务状态传递给TC
二阶段:
1.TC检查各个分支事务状态
2.提交/回滚
优点:
1.解决分布式事务问题,保证数据一致性
2.好多数据库底层支持XA协议,实现简单方便,无代码侵入
缺点:
1.资源第二阶段才释放,可用性比较低
2.必须要支持XA协议,才能使用XA模式
流程:
一阶段:
1.RM注册到TC中
2.执行SQL,直接提交
3.生成undolog快照、生产一个全局锁
4.把事务状态传递给TC
二阶段:
1.TC检查各个分支事务状态
2.提交-删除快照;回滚-根据快照执行恢复操作、删除快照
优点:
1.第一阶段直接释放资源,可用性比较高
2.实现简单方便,无代码侵入
缺点:
1.一致性降低
2.回滚时可能会出现异常情况,需要人工干预
注意:
lock_table-----TC(Seata服务端)
undo_log-----RM(微服务)
流程:
一阶段:try 资源预留,把资源状态汇报给TC
二阶段:业务提交,资源扣减
二阶段:业务回滚,资源回滚
优点:
效率高、并且保证数据一致
缺点:
实现复杂
代码侵入
问题:
空回滚:cancle 判断【全局事务】状态,如果stats不存在,说明try失败,无须回滚
业务悬挂:try 判断【全局事务】状态,如果stats为cancle,说明事务已经结束,无须再try
流程:
优点:
缺点:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。