MySQL InnoDB引擎四大特性ACID实现方案分析

概要

对于Mysql,事物的支撑并不依赖于Server层,不同的存储引擎对于事物的支持也不一样,对于我们常用的InnoDB引擎,其提供了一套基于【ACID模型】的事物完整的解决方案。为什么MyISAM不支持事务了,因为MyISAM并没有基于ACID模型去提供整套的解决方案

所谓的ACID模式,就是我们常说的事物的四大特性。假如我问一个问题:事物和锁之间是什么关系?事物大家都知道,锁大家也都知道,但是这两个放在一块大家就不知道了,感觉有关系,但又说不上来哪里有关系。通过下面的文章分析,大家就能清晰的认识到他们两个之间的关系了。而不是网上给大家提供的模糊性的回答,锁是事物实现的一种机制这种。

  • 原子性(Atomicity)
    对于每个事务都是一个不可分割的最小工作单元,整个事务中的所有操作要么全部成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

  • 一致性(Consistency)
    数据库从一个一致性的状态转换到另外一个一致性的状态。举个转账的例子:张三给李四转账100块,张三的账户扣减100,李四账户新增100,这个数据的总量的一致就是一致性的解释。不会转账失败而导致这个总量100出现不一致。

  • 隔离性(Isolation)
    隔离性是指当多个事务同时对数据库进行操作时,每个事务都是独立的,一个事务的操作不会影响到其他事务,对于不同的隔离级别,隔离性的实现方案也有所不同。

  • 持久性(Durability)
    一旦事务提交,则其所做的操作就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

虽说是四大特性,但是他们之间并不平级,AID都是为了C(一致性服务的)
在这里插入图片描述

InnoDb引擎ACID模型的实现方案

  • 原子性的实现方法
    为了实现原子性的操作,InnoDB引擎在每次执行增删改查时,都需要先记录作反向操作undoLog,当执行过程中出现了异常,就会执行undoLog当中将sql的反向操作。这样就相当于所有的操作都没有执行,保证原子性。

  • 隔离性的实现方案
    隔离性分为写+写隔离,写+读隔离。写+写隔离通过锁来实现,写+读隔离通过MVVC来实现。
    为什么不能直接通过锁来实现隔离性了?这个就设计到多线程并发访问的问题。举个例子:如果我们只通过锁来解决隔离性,假设我们的隔离级别为可重复读。如下图:不论怎么利用锁,我们都是无法在二次读取时还能读取到zhangsan这个数据。有的小伙伴可能说,我可以加一个S锁呀,防止其他的线程加X锁。但是这样的话执行流程不就串行化了嘛,其他线程想修改数据必须得等S锁释放,不然会被阻塞。所以为了应对这种场景,我们就引入了MVCC机制。
    在这里插入图片描述

  • 持久性解决方案
    mysql在哪些执行过程会导致持久性异常了?我们在写数据时,mysqlServer端正打算往数据库的idb文件当做做刷盘处理时,机器突然异常掉电或者其他的意外,在没有持久性解决方案时就会出现刷盘异常,此时我们就需要引入redoLog来实现持久性解决方案。

  • 一致性的解决方案依托于上面的三个解决方案,当保证了AID的,我们的一致性就解决了

小结

基于上述的理解,我们就可以知道mysql的事物的四大特性的实现方案,也清楚了为什么只有InnoDB引擎才能实现事务,而MyISAM不支持事务的原因。因为InnoDB引擎基于事务的四大特性都实现了具体的解决方案,如果其他的存储引擎如果想要满足事务的话,也可以去根据ACID模型去实现自己的解决方案即可。而且通过分析我们也大致了解,InnoDB通过什么技术方案去实现了ACID模型。方便我们对于事物,锁这有都有一个基础的认知,我们需要对这些概念清晰了,后续才可以更方便的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值