mysql表角色互斥_MySql那些事儿(八):一篇文章搞懂事务的隔离性与锁

作者:阿茂

从今天开始我们来填之前Mysql系列文章的坑,这一篇文章我们来聊一聊Mysql的事务隔离性与隔离级别,这个概念是面试基本上涉及到Mysql问题必问的问题。接下来跟我一起来梳理下相关概念,让你在面试中游刃有余,在平时工作中少踩坑。提到事务我就得碎碎念ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),而这里我们说的就是其中的“隔离性”。当我们在同一个数据库中同时执行多个事务时就会出现:脏读,不可重复读,幻读的问题,为了解决这个问题,数据库中就有了隔离级别的概念。常规的隔离级别包括:读未提交,读提交,可重复读,串行化。读未提交:一个事务还没提交时,它做的变更就能被别的事务看到;

读提交:一个事务提交之后,它做的变更才会被其他事务看到;

可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时(所有已提交数据)看到的数据是一致的;

串行化:就是同一行记录在被事务读写时,通过互斥方式保证同一时刻只有一个事务执行,其他事务处于阻塞中。

事务隔离的实现与MVCC

关于事务的隔离性实现,这里将通过“可重复读”展开说明。事务在启动的时候会为每一个事务创建一个read-view(也称之为“事务快照”)并且数据系统会给它分配一个全局唯一的递增ID称之:transaction id。每个事务来更新这一行数据时,都会产生一个数据版本,并且把transaction id赋值给当前数据版本的事务ID,称之:row trx_id。与之同时回保留旧版本数据日志(undo log),在新版本中的roll_pointer指向旧版本id。也就是说一行记录可能会有多个版本,每个版本都会有自己的row trx_id。这里说明一下,数据版本只是一个逻辑概念,而不是物理存在的。它可以通过当前版本的undo log依次计算出之前每个数据版本(read-view)的数据与版本信息。我们在本系列文章《MySql那些事儿(五):事务是个什么东西?》中介绍了关于read-view的一些属性说明,有了这些概念就很好判断某个版本是否可见:如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值