aba问题mysql_Mysql事务隔离以及MVCC实现原理

本文介绍了MySQL事务的ACID特性,重点讲解了InnoDB的多版本控制(MVCC)和原子性如何通过undo日志实现。在可重复读隔离级别下,MVCC通过read-view和undo日志保证事务一致性。同时,文章讨论了长事务可能导致的问题及删除记录时MVCC的机制,并澄清了MVCC与乐观锁的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eb11628b1d871346a3689d11138792a6.png

上一篇我们了解了mysql的几种日志,大致知道这些日志的作用,今天我们配合Mysql的事务以及事务的隔离级别进一步理解mysql如何实现事务相关的特性。其中重点理解mysql innodb的多版本控制和乐观锁,这篇大部分是文字描述,也是理解mysql-innodb事务的基础内容,也是面试会问到的内容。

事务的特征ACID

原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。上一篇我们知道 redo log 用于保证事务持久性,是因为每次数据变更,mysql都会先记录redo log,然后更新到数据页的缓存,然后在刷到磁盘中;那mysql是如何实现原子性的呢,首先理解原子性,就是一组操作单元,要么全部执行成功,要么不执行,我们在做分布式的系统的时候,就会涉及到分布式的事务,两个分布式操作,要么都成功,要么都失败,所有的操作都需要回滚到最初的状态,我们所了解有XA协议规则,XA是比较老的分布式事务基础,它的核心思路是基于两阶段提交的方式,第一阶段,数据准备,然后锁住资源,第二步才会提交。今天我们不讨论分布式事务的方案,这里不做深入研究,大家可以了解一下两阶段和TCC三阶段,以及Base定理和CAP定理。好了,言归正传,我们从工作中的场景,来反向思考,mysql的事务是如何实现的呢?对于一个事务如何保证这些语句最终能保证原子性呢?上一篇讲到了redolog 和binlog的一致性方案,就涉及到两阶段提交的方式来保证一致性。这里要讲的是Mysql的undo log,它是保证事务的原子性和隔离性的基础。

我们知道mysql事务中只要对数据修改的,都会生成相应的undo日志,1.对于每个 insert,这会往undo日志插入一条对应的删除语句,回滚时会执行 delete2.对于每个 delete,回滚时会执行 insert。3.对于每个 update,回滚时会执行一个相反的 update,把数据改回去。以 upd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值