对于Mysql事务我们都知道事务具有ACID四个特性,分别为:
基于以上四个特性,我们可以总结出事务 多个操作要么一起成功,要么一起失败,事务提交后,进行落盘存储,接下来我们来看一下InnoDB是如何实现事务的
对于Innodb它主要由俩个事务日志文件redoLog和undoLog来保证事务的原子性,一致性,持久性;隔离性由锁来控制 如间隙锁,排它锁;
是什么?
redolog是InnoDB里用来记录事务提交的物理日志文件,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,主要用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
通过redolog实现 记录的是新数据的备份 用来持久化
Undolog记录的是旧数据 用来数据的回滚
redo log进行刷盘比对数据页刷盘效率高,具体表现如下
什么是脏读,幻读,不可重复读?
脏读: 读取到了其他事务未提交的数据
不可重复读: 是指在同一个事务中以相同条件去读取到的数据不同 针对修改
幻读: 一个事务中以相同条件去读取到的数据的条数不同 针对的是插入和删除
Mysql隔离级别:
读未提交:
产生: 脏读 幻读 不可重复读
读提交:
可以解决脏读
产生:幻读 不可重复读
可重复读:
可以: 脏读 幻读 不可重复读
幻读(mysql使用间隙锁实现)
串行化:
可以解决: 脏读 幻读 不可重复读
分布式事务解决方案:
2pc 两段式提交优缺点
一个下订单的操作
订单服务 库存服务 积分服务
一个下请求所涉及到的操作, 也是相当于一组操作,全局事务,而针对于每个单独的服务而言的事务 称之为分支事务
怎么才能够知道哪些分支事务是属于一个全局事务的呢?
Seata处理分布式事务流程:
Xid:全局事务的id
Tc:事务协调器 用来注册全局事务和管理分支事务的状态
TM:全局事务管理器 用来提交或者回滚全局事务
Rm:分支事务管理器
流程:
此时只需要删除每个分支事务的undolog即可,因为分支事务的本地事务已经提交过了
如果分支事务中有失败的,
此时那些成功的分支事务就要根据undolog去回滚