1.MySQL逻辑架构了解吗?
整体分为三层:
第一层是服务器,主要是提供连接处理、授权认证、安全等功能。
第二层是SQL层,实现了MySQL核心服务功能,包括查询解析、分析、优化、缓存以及日期和时间等所有内置函数,所有跨存储引擎的功能都在这一层实现。例如存储过程、触发器、视图等。
第三层是存储引擎层,存储引擎负责MySQL中数据的存储和提取。服务器通过API与存储引擎通信,这些接口屏蔽了不同存储引擎的差异,使得差异对上层查询过程透明。除了会解析外键定义的InnoDB外,存储引擎不会解析SQL,不同存储引擎之间也不会相互通信,只是简单响应上层服务器请求。
2.简单谈一谈MySQL的读写锁
在处理并发读或者写时,我们可以通过实现一个由两种类型组成的锁来解决问题。
这两种类型的锁就是共享锁(读锁)和排他锁(写锁)。
读锁是共享的,相互不阻塞,多个客户在同一时刻可以同时去读取同一个资源,互相不会受到干扰。
写锁是排他的,一个写锁会阻塞其他的写锁和读锁,确保在给定时间内只有一个用户能够执行写入并防止其他用户读取正在写入的同一资源。
写锁比读锁有更高的优先级,一个写锁请求可能会被插入到读锁队列的前面,但读锁不能插入到写锁前面。
3.MySQL锁策略有什么?
表锁是MySQL中最基本的锁策略,开销最小。表锁会所定整张表,一个用户在对表进行写操作之前需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的用户才能获得读锁,读锁之间不相互阻塞。
行锁可以最大程度的支持并发,同时也带来了最大开销。行锁只在存储引擎层实现,而服务器层没有实现。
4.事务是什么?
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
5.事务有什么特性?
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability)
原子性:事务是数据库的逻辑工作单位,事务中包括的所有操作要么都做,要么都不做。
一致性:事务的执行结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不一致的状态。
隔离性:一个事务的执行不能被其他事务干扰。一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性:也称永久性,指一个事务一旦提交,他对数据库中数据的改变就应该是永久的,即使系统崩溃,修改的数据也不会丢失。
6.事务的并发问题
实际场景中,事务并不是串行的,所以会带来以下三个问题:
- 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据就是脏数据。
- 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数做了更新并提交,导致事务A多次读取同一数据时,结果不一致。
- 幻读:原本不存在的数据却真实的存在了。当查询某一记录是否存在时,发现不存在,然后准备插入,这个时候,他又存在了,无法插入,原因另一个事务插入了这个数据。
不可重复度侧重于修改,幻读侧重于新增或删除。
7.MySQL的隔离级别有哪些?
READ UNCOMMITTED 未提交读
该级别中事务的修改即使没有提交,其他事务也是可看见的。事务可以读取其他事务修改完但未提交的数据,这种称为脏读。
READ COMMITTED 提交读
多数数据库系统默认的隔离级别。一个事务从开始直到提交之前的任何修改对其他事务都是不可见的,也叫做不可重复读。
REPEATABLE READ 可重复读(MySQL默认的隔离级别)
一个事务按相同的查询条件读取以前检索过的数据,其他事务插入了满足其查询条件的新数据,产生幻行。可重复读解决了不可重复读的问题,保证了在同一个事务中多次读取同样的记录结果一致,但还是无法解决幻读。
SERIALIZABLE 可串行化
最高的隔离级别。通过强制事务串行执行,避免幻读。