​ MySQL的众多存储引擎中,工作中用的的是InnoDB。而说起InnoDB,它涉及的两个最重要的概念也就是多版本并发控制以及事务。下面就来浅谈这两个概念🍻

事务

​ 说到事务其实最最常谈到的就是它的四大特性,原子性一致性隔离性持久性,简称ACID。(ps: 🤔这估计是最常问的八股了)

​ 先说原子性,通俗上来讲,也就是事务需要保证包装在事务里的所有操作要么同时成功,要么同时失败。

​ 一致性主要的语义是InnoDB主要通过双写及灾难恢复来防止数据crash掉。

​ 隔离性使事务之间彼此的操作变得不可见。

​ 持久性是指数据库通过双写和binlog机制保证了数据的持久性。

多版本并发控制

​ 多版本并发控制简称MVCC,这个概念的存在是事务特性的基石,事务需要通过这些版本来做回滚和一致性的保证。

​ 对于数据的每一条行记录,InnoDB会维护三个变量值:

  • DB_TRX_ID:该行记录最新的事务编号
  • DB_ROLL_PTR:它是一个指向undo log的指针,会在行更新前保存当前行的必要信息
  • DB_ROW_ID:当新插入数据时这个值会自增

​ 对于undo log,它主要记录两种操作:update和insert。这里delete操作被视为update操作。对于插入操作,它的undo log将在插入完成后被废弃。对于更新操作,undo log则需要在当下不存在事务需要用到该操作的快照才可废弃。换而言之,删除操作和更新操作一样,在undo log没有被废弃之前,数据并不会物理性删除。

​ 因此,我们需要尽可能的保证事务不要太大,从而让后台的清理线程可以清理掉无用、失效的数据。

​ 此外,并发控制使用一种不同的方式对待聚簇索引和二级索引。对于聚簇索引来说,数据存储在其上,而二级索引不存储数据。当二级索引发生删除时,它将会被标记并后续被清理掉。在用户的读操作发生后,二级索引的事务号会从聚簇索引中拉取一遍。


<
Previous Post
MySQL随笔 - Part I
>
Next Post
MySQL随笔 - 内存数据结构