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_id<transaction id,则只能去undo log里去取。去undo log查找数据的时候,也需要做比对,必须up_limit_id>transaction id,才返回数据

“快照”在MVCC里怎样工作

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值