文章目录
- 概要
- 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模型。方便我们对于事物,锁这有都有一个基础的认知,我们需要对这些概念清晰了,后续才可以更方便的学习。