02 | 日志系统:一条SQL更新语句是如何执行的?

2019-07-09 16:10:49

本文的总结源于林晓斌在极客时间里面的课程,为避免产生商业问题,我只是用于个人学习总结。
原文地址:https://time.geekbang.org/column/article/68633

本篇重点

yi-tiao-sqlgeng-xin-yu-ju-shi-ru-he-zhi-xing-de

一条SQL语句的执行步骤

update T set c=c+1 where ID=2;

执行流程图

2e5bff4910ec189fe1ee6e2ecc7b4bbe

小结

  • redo是物理的,binlog是逻辑的;现在由于redo是属于InnoDB引擎,所以必须要有binlog,因为你可以使用别的引擎
  • 保证数据库的一致性,必须要保证2份日志一致,使用的2阶段式提交;其实感觉像事务,不是成功就是失败,不能让中间环节出现,也就是一个成功,一个失败
  • 如果有一天mysql只有InnoDB引擎了,有redo来实现复制,那么感觉oracle的DG就诞生了,物理的速度也将远超逻辑的,毕竟只记录了改动向量
  • binlog几大模式,一般采用row,因为遇到时间,从库可能会出现不一致的情况,但是row更新前后都有,会导致日志变大
  • 最后2个参数,保证事务成功,日志必须落盘,这样,数据库crash后,就不会丢失某个事务的数据了
01 | 基础架构:一条SQL查询语句是如何执行的?

本文的总结源于林晓斌在极客时间里面的课程,为避免产生商业问题,我只是用于个人学习总结。 原文地址:https://time.geekbang.org/column/article/68319 思维导图 问题总结 MySQL的框架有几个组件,各有什么作用? Server层和存储引擎层各有什么作用? you have an error in your SQL syntax这个是在词法分析还是在语法分析里面报的错? 对于表的操作权限验证是在哪里进行? 执行器的执行查询语句的流程是什么样的?

03 | 事务隔离:为什么你改了我还看不见?

本文的总结源于林晓斌在极客时间里面的课程,为避免产生商业问题,我只是用于个人学习总结。 原文地址:https://time.geekbang.org/column/article/68963 思维导图 图形解说 针对上面看到的四个隔离级别,并结合这个案例来进行解说,我们来看看不同的隔离级别下,事务A会有哪些不同的返回结果,也就是图里面V1、V2、V3的返回值分别是什么 若隔离级别是“读未提交”,则V1的值就是2.这时候事务B虽然还没有提交,但是结果已经被A看到了。因此,V2、V3也都是2. 若隔离级别是“读提交”,则V1是1,V2的值是2.事务B的更新在提交后才能被A看到。所以V3的值也是2. 若隔离级别是“可重复读”,则V1、V2是1,V3是2.之所以V2还是1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。