事务并发遇到的问题

写覆盖

图片说明

脏读

图片说明

不可重复读

图片说明
图片说明

幻读

图片说明
图片说明

隔离级别

图片说明
图片说明
图片说明
图片说明
每次对记录进⾏改动,都会记录⼀条 undo⽇志 ,每条 undo⽇志 也都有⼀个 roll_pointer 属性( INSERT 操作对应的 undo⽇志 没有该属性,因为该记录并没有更早的版本),可以将这些 undo⽇志 都连起来,串成⼀个链表
图片说明
对该记录每次更新后,都会将旧值放到⼀条 undo⽇志 中,就算是该记录的⼀个旧版本,随着更新次数的增多,所有的版本都会被 roll_pointer 属性连接成⼀个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当前记录最新的值。另外,每个版本中还包含⽣成该版本时对应的 事务id ,这个信息很重要,我们稍后就会⽤到

readview

对于使⽤ READ UNCOMMITTED 隔离级别的事务来说,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了;对于使⽤ SERIALIZABLE 隔离级别的事务来说,设计 InnoDB 的⼤叔规定使⽤加锁的⽅式来访问记录(加锁是啥我们后续⽂章中说哈);对于使⽤ READ COMMITTED 和 REPEATABLE READ 隔离级别的事务来说,都必须保证读到已经提交了的事务修改过的记录,也就是说假如另⼀个事务已经修改了记录但是尚未提交,是不能直接读取最新版本的记录的,核⼼问题就是:需要判断⼀下版本链中的哪个版本是当前事务可⻅的。为此,设计 InnoDB 的⼤叔提出了⼀个 ReadView 的概念,这个 ReadView 中主要包含4个⽐较重要的内容:

图片说明

特别重要

图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明
图片说明