关于MySql的事务隔离原理

学习了林晓斌<<MySQL45讲>>中关于事务的文章后, 把一些点总结一下, 便于之后记忆:

Mysql在事务开始时,会创建一个”一致性读视图”. 它没有物理结构,作用是事务执行期间用来定义”我能看到什么数据”.

  1. 每个事务有全局唯一的ID, 并且向上递增(由MySQL的事务系统控制).

2. 表的每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id。同时,旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它。也就是说,数据表中的一行记录,其实可能有多个版本 (row),每个版本有自己的 row trx_id。

3. InnoDB 为每个事务构造了一个数组, 用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交。

这样在事务内的数据可见性, 就转化为: 当前事务构造的事务ID数组和行数据对应的row trx_id之间的映射关系. 一个数据版本,对于一个事务视图来说,除了当前事务的更新总是可见以外,有三种情况:

未提交,不可见;

已提交,但是是在视图创建后提交的,不可见;

已提交,而且是在视图创建前提交的,可见。

另外附加一个原则: 所有更新数据都是先读后写的,而这个读,只能读当前的值(即实时被更新的值),称为“当前读”(current read)。

同时, 更新数据前都会加排它锁, 所以如果前一个更新未提交, 当前更新就一直处于等待状态.