MySQL的事务隔离级别及其原理

一、MySQL事务的四种隔离级别

读未提交(READ UNCOMMITTED),可以读到其他事务中未commit的数据
读已提交(READ COMMITTED),只能读到其他事务已commit的数据
可重复读(REPEATABLE READ),只能读取到本事务启动之前其他事务已commit的数据
序列化串行(SERIALIZABLE),所有事务串行化,不允许并行执行
isolation levels
通常在关于事务隔离级别的文章中,会提到读脏读、不可重复读、幻读三个数据一致性的问题,而又有很多文章提到只有序列化串行级别才能解决幻读,但是实际上在MySQL中,可重复读级别就能够解决全部三个问题。接下来将对可重复读的原理进行深入讲解。

二、两个关键的数据结构

Undo Log

MySQL中使用一种名为MVCC的技术实现了读已提交和可重复读,而MVCC的多个版本的数据正是基于Undo页,Undo页结构如下所示:undo页结构
MySQL中每一个record中,都会有额外的DB_TRX_ID字段记录了写入或修改该行数据的事务ID,DB_ROLL_PTR字段记录了指向修改之前的数据的指针,所以在MySQL运行期间对每一行数据的修改记录,都会被记录在undo页中。

ReadView

在可重复读的隔离级别下,每个事务在begin时,都会创建一个ReadView对象,记录了事务begin那一刻所有正在执行的事务,如下图所示(源代码链接):
ReadView
m_low_limit_id 是当前正在执行的事务的ID的最大值
m_up_limit_id 是当前正在执行的事务的ID的最小值
m_creator_trx_id 是创建该ReadView的事务的ID
m_ids 是所有正在执行的事务的ID的列表

三、源码分析

初始化阶段

为事务创建一个新的ReadView对象,将此时系统中活跃的事务id记录到对象中

Created with Raphaël 2.3.0
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值