mysql实战45讲笔记--08

08 事务到底是隔离的还是不隔离的
(理论,多读)

        Mysql里,有两个“视图”的概念
        1.一个是view,他是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果,创建视图的语法是create view …,查询方法和表一样
        2.另一个是InnoDB在实现mvcc时用到的一致性视图,即consistent read view,用于支持RC(Read Committed,读提交)和 RR(Repetable Read,可重复读)隔离级别的实现。
        3.事务是如何实现的MVCC
        (1)每个事务都有一个事务ID,叫做transaction id(严格递增)
        (2)事务在启动时,找到已提交的最大事务ID记为up_limit_id。
        (3)事务在更新一条语句时,比如id=1改为了id=2.会把id=1和该行之前的row trx_id写到undo log里,并且在数据页上把id的值改为2,并且把修改这条语句的transaction id记在该行行头
        (4)再定一个规矩,一个事务要查看一条数据时,必须先用该事务的up_limit_id与该行的transaction id做比对,如果up_limit_id>=transaction id,那么可以看.如果up_limit_idtransaction id,才返回数据

“快照”在MVCC里怎样工作

        在可重复读隔离级别下,事务在启动的时候“拍了个快照”,基于整库的。
mysql实战45讲笔记--08_第1张图片
        对于当前事务启动瞬间来说,一个数据版本的row trx_id有几种情况
        1.绿色,表示这版本是已提交事务或当前事务生成的,数据可见
        2.落在红色,表示这个版本由将来启动的事务生成的,不可见
        如果落在黄色部分,那就包括两种情况
                a.若 row trx_id 在数组中,表示这个版本是由还没提交的事务生成的不可见;
                b.若 row trx_id 不在数组中,表示这个版本是已经提交了的事务生成的,可见。

        InnoDB利用了“所有数据都有多个版本”的这个特性,实现了“秒级创建快照”的能力。
        对于可重复读,查询只承认在事务启动前就已经提交完成的数据
        对于读提交,查询只承认在语句启动前就已经提交完成的数据
        当前读,查询只承认在语句启动前就已经提交完成的数据

你可能感兴趣的:(学习笔记)