MySQL逻辑架构
1. MySQL逻辑架构
如图,MySQL服务器逻辑架构分为三层:
第一层,这一层不是MySQL独有的解构,很多基于网络的架构都需要这一层,用于做连接处理、授权认证、安全等等。
第二层,MySQL的核心功能的核心层,称作SQL Layer,查询解析、分析、优化缓存以及所有的内置函数都在这一层完成,所有跨存储引擎的功能也都在这一层实现:存储过程、触发器、视图等等。
第三层,MySQL的最底层,包含了存储引擎(注:存储引擎负责MySQL中数据的存储和读取),服务器通过API和存储引擎进行通讯,而接口屏蔽了存储引擎之间的差异,对上层查询透明。
2.并发控制
多个session之间的读写产生的并发问题在生产上是很常见 的,MySQL从多个角度进行并发控制。
2.1读写锁
2.1.1 共享锁(Share Lock)
共享锁又被称为读锁,常被简称为 S 锁。一个事务获取到数据行的共享锁后,其他事务也可以获取到此数据行的共享锁,但是不能获取到该数据行的排他锁,也就是说当某一数据行被一个事务读取的时候,其他事务可以并发的去读取数据,但是不能修改此数据,直到共享锁被事务释放。
在查询语句后面添加 LOCK IN SHARE MODE , Mysql会对查询结果的每一行添加共享锁。
2.1.2排它锁(eXclusive Lock)
排它锁又被称为写锁,常被称为X锁。一个事务获取到数据行的排它锁后,其他事务不能获取到该行的任何锁,即,当一个事务对某一数据行进行修改的时候,其他事务不能对该数据行进行增删改查。
在查询语句后面添加 FOR UPDATE , MySQL会对查询结果的每一行添加排他锁。
2.2意向锁
意向锁是表级锁,对于 insert 、delete、update, InnoDB会自动给涉及到的数据添加意向锁,无需用户干预。
意向锁又分为 意向共享锁(IS)和意向排他锁(IX),这里不再展开阐述,有兴趣的读者可自行去百度理解。
2.2锁粒度
我们上面介绍了几种锁,可以很直观的看出,当我们的锁锁定的数量越少,数据库可以接受的并发程度就越高,那我们为什么不直接用行锁来应对所有的并发情况呢,这样的锁定的数据量是最小的。但是为什么不这样做呢?因为锁的获取、检查、释放等操作一样要消耗系统资源。
MySQL提供两种重要的锁策略,行级锁(row lock),行级锁可以面对最大的并发处理,但相应的也面对着最大的锁开销。行级锁只在存储引擎层实现,服务器层没有实现。
表锁(table lock),表锁是开销最小的锁策略。