(一) mysql 架构
1.1 逻辑架构
第二层:查询解析,分析,优化,缓存以及所有的内置函数(日期,时间,数学等等),以及所有的夸存储引擎的功能:存储过程、触发器、视图等
第三层:包含存储引擎,存储引擎是负责数据的存储和提取的。存储引擎都实现了同样的接口,屏蔽了不同ing存储引擎的差异。
存储引擎API 的底层函数,用于执行"开始事务"或者"根据主键提取一行记录"等操作
注意:存储引擎不会去解析sql 1 ^1 1,不同存储引擎间不互相通信,只是简单响应上层服务器的请求
1 _1 1 InnoDB 是一个例外,会解析外键定义,因为mysql服务器本身没有实现该功能
1.2 并发控制
-
问题
多个查询需要在同一时刻修改数据
类比邮件,如果两封邮件同时到达同一个收件人服务器,入过不控制,会发生两封邮件内容相互追加 -
读写锁
写操作: 加锁(独占锁),只能有一个线程在写
读操作:只能在没有写锁存在的情况下才能获取(共享锁),可多个线程读
注:一个写锁或阻塞其他的写锁与读锁 -
锁粒度
含义:锁定的数据量越少,则系统的并发程度越高(比如jdk1.7 与jdk1.8 的hashmap 的实现区别)
3.1表锁(tabkle lock)
写操作对整张表加锁(锁开销小),会同时阻塞其他用户对该表的读、写操作
3.2 行锁(row lock)
特点: 最大程度支持并发处理(锁开销最大)
注:行级锁只在存储引擎实现1.3 事务
- 含义
指的是一组原子性的sql查询,或者是说是一个独立的工作单元(单元内的sql要么都成功,要么全部失败) - 事物特性以及隔离级别
原子+一致+持久+隔离 - 隔离级别:
- read uncommitted
- read committed
- repeatble read(mysql 默认的事务隔离级别)
- serilizable (完全牺牲并发性,只能串行操作,隔离级别最高)
- 不考虑隔离性可能出现的问题:
详细参见另一篇博客
https://blog.csdn.net/qq_36922927/article/details/89326635
-
死锁
含义:两个或多个 -
事务日志
日志:顺序io
磁盘io:是随机io
预写日志: -
mysql 中的事务
- auto commit
- set transaction isolation level (设置事务隔离级别)
- 同一个事务中使用多种存储引擎不可靠(事务是在存储引擎中实现的)