并发控制保证数据一致性的常见手段有:
锁(Locking),数据多版本(Multi Versioning)

普通锁:
操作数据前锁住,不允许其他并发操作
操作完成后,释放锁,让其他任务执行

但是此举太多简单粗暴,读任务也无法进行,于是出现了共享锁和排他锁:S锁Share Locks和X锁eXclusive Locks,添加数据时加S锁,修改数据时加X锁,
共享锁之间不互斥:简单记为 读读可以并行
排他锁与任何锁互斥:简单记为:写读 写写不可并行

一旦写数据的任务没有完成,数据时不可能被其他任务读取的,这对并发有较大的影响
对应到数据库:写事务没有提交,读相关数据的select也会被阻塞
有没有可能,写任务还没有完成,其他读任务也能并发,这就引出数据的多版本

进一步提高并发方法:数据多版本
核心原理是:1.写任务发生时,将数据克隆一份,以版本号区分,2.写任务操作新克隆的数据,直接提交,3.并发读任务可以继续读取旧版本的数据,不至于阻塞
并发控制(Innodb)的理解_第1张图片

  1. 最开始数据的版本是V0;
  2. T1时刻发起了一个写任务,这是把数据clone了一份,进行修改,版本变为V1,但任务还未完成;
  3. T2时刻并发了一个读任务,依然可以读V0版本的数据;
  4. T3时刻又并发了一个读任务,发依然不会阻塞
    总结:可通过读取旧版本数据 极大的提高任务的并发度

提高并发的演进思路:
普通锁,本质串行执行
读写锁,读读并发
数据多版本,实行读写并发

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
在这里先说一下mysql的随机IO和顺序IO:mysql的数据最终都会刷到磁盘上去,刷盘分为随机IO和顺序IO,一般会改变设计使随机IO变为顺序IO来提高性能,
随机IO:写数据文件 ibd,MYD,MYI,Innodb数据文件 ibdata1, 同步信息记录文件 master.info,relay-log.info
顺序IO:主要在日志方面,事务日志:ib_logfile0,ib_logfile1,查询日志:general log。慢查询日志:
slow log错误日志error log binlog and relay log
扩展:【如数据库a,表格b。
1、如果表格b采用MyISAM,data\a中会产生3个文件:
b.frm :描述表结构文件,字段长度等
b.MYD(MYData):数据信息文件,存储数据信息(如果采用独立表存储模式)
b.MYI(MYIndex):索引信息文件。

2、如果表格b采用InnoDB,data\a中会产生1个或者2个文件:
b.frm :描述表结构文件,字段长度等
如果采用独立表存储模式,data\a中还会产生b.ibd文件(存储数据信息和索引信息)
如果采用共存储模式的,数据信息和索引信息都存储在ibdata1中
如果采用分区存储,data\a中还会有一个b.par文件(用来存储分区信息)】

对应到Innodb上:
redo undo 回滚
redo:数据库事务提交后,将更新后的数据刷到磁盘上,保证ACID特性,磁盘随机写的性能较低,如每次都刷盘,极大影响数据库的吞吐量,优化方法是 将修改行为优先写到redo日志中(变成了顺序写),再定期将数据刷到磁盘上,及随机写优化为顺序写。
总结:redo用于保障,如数据库崩溃,重启后,会重新做redo日志中的内容。保证ACID一致性

undo:数据库事务未提交时,会将事务修改数据的镜像(旧版本)存放到undo日志中,事务回滚时,或者数据库崩溃时,可利用undo日志,撤销未提交事务对数据库产生的影响。
细节:对于insert操作,undo日志记录新数据的PK(ROW_ID),回滚时直接删除;
对于delete/update操作,undo日志记录旧数据row,回滚时直接恢复;
总结:undo日志用于保障,未提交事务不会对数据库的ACID特性产生影响。

回滚:存储undo日志的地方是回滚段
并发控制(Innodb)的理解_第2张图片
启动事务:
start trx;
delete (1, shenjian);
update set(3, lisi) to (3, xxx);
insert (4, wangwu);
并且事务处于未提交的状态。
并发控制(Innodb)的理解_第3张图片
(1)被删除前的(1, shenjian)作为旧版本数据,进入了回滚段;
(2)被修改前的(3, lisi)作为旧版本数据,进入了回滚段;
(3)被插入的数据,PK(4)进入了回滚段;
接下来,假如事务rollback,此时可以通过回滚段里的undo日志回滚。
假设事务提交,回滚段里的undo日志可以删除。
并发控制(Innodb)的理解_第4张图片
(1)被删除的旧数据恢复了;
(2)被修改的旧数据也恢复了;
(3)被插入的数据,删除了;
事务回滚成功,一切如故。

Innodb 多版本并发控制 存储引擎

大部分的内容来源于:https://baijiahao.baidu.com/s?id=1608644276809286198&wfr=spider&for=pc%20https://home.firefoxchina.cn
理解着看的,希望以后能理解的更透彻