1. mysql的逻辑架构

(图片来源:https://blog.csdn.net/fuzhongmin05/article/details/70904190)
连接线程处理:每个客户端都会在服务器进程中拥有一个线程。一般使用线程池,不必每次都创建和销毁。
解析器:mysql会对查询语句进行解析,解析为一个内部的数据结构,然后对这个结构进行优化:重写查询,决定表的读取顺序,选择合适的索引等(?)。
2. mysql的并发控制:
- 锁粒度包含了很多种,最重要的包含了表级别的锁,行级别的锁:表锁和行级锁;
- 表锁一般使用读写锁实现,写优先;行级锁的实现比较复杂。
- 锁的粒度越大,实现起来越简单,但是延迟也就越大;
- mysql的锁粒度是可以配置的。
3. 事务的概念
一个事务包含了很多的操作,这些操作具有以下四个特性:
- 原子性:一个事务中的操作要么全部完成,要么全部没完成,完成一半出问题,需要将当前事务回滚到未操作之前;
- 一致性:事务完成与没有完成是两个状态,数据库只在这两个状态之间切换,没有第三种状态。
- 隔离性:一个事务与另一个事务是相互无影响的;
- 持久性:事务完成之后提交到数据库,数据是持久保存在数据库中的。
4个特性简称ACID。
4. 隔离级别
四个级别:
-
RU:未提交读(READ UNCOMMITED)
事务之间相互可见。不常用。 -
RC :提交读(READ COMMITED)
大多数数据库默认这个级别(mysql不是):一个事务只能看到另一个事务提交之后的状态,不能看到事务内部。
存在不可重复读的问题:一个事务内的两次相同的读,结果可能会不一样。 -
RR:可重复读(REPEATABLE READ)
mysql属于这个级别:同一事务中的两次相同的读,结果是一样的。
存在幻读的问题:同一事务内读取范围内的记录时,不能保证每次行数是一样的。 -
S:可串行化(SERIALIZABLE)
最高的隔离级别:强制事务之间串行执行。大量的锁争用,很少使用。
5. 死锁问题
数据库中发生死锁的概率很大,要有对死锁的处理能力。(两个事务同时等待对方已经持有的锁)
(1)死锁检测:检测有可能死锁,返回一个错误;
(2)死锁超时:事务超时,将比较简单的事务回滚。
网友评论