接offer!接offer!
文章目录
一条SQL查询语句是如何执行的
- 连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接;
- 查缓存:MySQL拿到一个查询请求后,会先到查询缓存查看是否执行过这条语句。如果执行过其结果可能以键值对的形式,缓存在内存中;
- 分析器:输入的SQL语句由字符串和空格组成,MySQL需识别出里面的字符串分布代表什么;
- 优化器:当一条SQL语句的表里有多个索引,优化器可以决定使用哪个索引。或者在一个语句有多表关联(join)时,优化器可以决定各个表的连接顺序;
- 执行器:MySQL通过分析器知道做什么,通过优化器知道怎么做,最后进入执行阶段,开始执行语句。
数据库的事务隔离级别有哪些
- 读未提交
- 允许一个事务读取另一个事务未提交的数据修改;
- 是最低的隔离级别,存在脏读、不可重复读和幻读的问题。
- 读已提交
- 一个事务只能读取已经提交的数据,其它事务的修改在该事务提交后才可见;
- 解决了脏读问题,但仍可能出现不可重复读和幻读。
- 可重复读
- 事务执行期间,多次读取同一数据会得到相同的结果,即在事务开始和结束之间,其他事务对数据的修改不可见;
- 解决了不可重复读问题,但仍可能出现幻读。
- 在MySQL的InnoDB存储引擎中,默认的隔离级别是可重复读,并且通过Next-Key锁(行锁+间隙锁)在可重复读隔离级别下就避免了幻读。
- 序列化
- 最高隔离级别,确保事务之间的并发执行效果和串行执行效果相同,即不会出现脏读、不可重复读和幻读的问题。但是执行效率也是最低的。
补充:
- 脏读:一个事务读取了另一个未提交事务修改的数据。如果那个未提交的事务后来被回滚了,那么第一个事务读取的数据就是无效的。
- 举例:事务A修改了某行数据,但还没有提交。此时事务B读取了事务A修改后的数据。然后事务A因为某种原因回滚了,那么事务B读取的数据就是脏数据。
- 不可重复读:在一个事务内,多次读取同一行 数据,但是在两次读取之间,另一个事务修改了该行数据并提交,导致第一个事务两次读取的结果不一致。
- 举例:事务A第一次读取某行数据,然后事务B修改了该行数据并提交。接着事务A再次读取该行数据,发现数据不一致(被事务B修改了)。
- 幻读:在一个事务内,多次查询同一个范围的数据,但是在两次查询之间,另一个事务插入或删除了该范围内的数据,导致第一个事务两次查询的结果集数量不一致。注意:幻读是针对数据集的插入或删除(新增或减少记录) 。
- 举例:事务A第一次查询某个条件的数据,返回10条记录。然后事务B插入了一条符合该条件的数据并提交。接着事务A再次查询,返回11条记录,就好像发生了幻觉一样。