mysql架构与历史 笔记

MySQL中最重要的的特性是它的存储引擎架构。这种架构将查询处理其他系统任务数据存储提取相分离。正因为如此MySQL可以适用多数不同的场景中,成为一个最广泛应用的数据库。

1. MySQL的逻辑架构

下图是MySQL的逻辑架构
image
图片出自BLOG
大致分位三层:
第一层,和客户端交互,提供如连接处理、授权认证、保证安全性等功能。
第二层,MySQL的核心功能多数在这。包括它的各种内置函数还有存储过程、触发器、视图等功能。
第三层,这一层包括了存储引擎,提供存储和提取数据的功能。服务器通过API与存储引擎进行通讯。存储引擎和文件系统差不多,都是存储数据用的。MySQL常见的存储引擎有InnoDB、Memory和MyISAM等。
每个客户端连接MySQL服务器时都会有一个线程对应执行任务。
MySQL会解析查询,并进行优化处理。

2. 并发控制

2.1 读写锁

读锁是共享的,非阻塞的。多个客户可以同是读取同一个资源,并且互不干扰。
写锁是独占的,它会阻塞其他的读锁或者写锁。这样能确保在给定的时间里,只有一个用户的写入是成功的。

2.2 锁粒度

理想情况下,只对修改的数据进行精确的加锁,锁定的数据量越小,并发越高。但是加锁、管理锁也需要消耗资源。MySQL则提供了多种选择,面对不同场景提供不同的锁策略或者说锁粒度。
表锁 最基本的锁策略,用户对表进行增删改等写操作时,要先获得锁。
行级锁 行级锁能过最大程度的支持并发,它只能在存储引擎层实现。

3. 事务

事务可以看作是一组原子性的SQL查询或者工作单元。它具有ACID特性,如下。
原子性(Atomicity)
不可再分,要么成功,要么失败回滚。
一致性(Consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。多个符合原子性的事务执行顺序不一样,可能不符合一致性。
隔离性(Isolation)
当多个并发事务对数据进行读写修改时,隔离性可以在不同程度防止不一致的情况。下面的隔离级别讲的就是这个。
持久性(Durabili)
一旦提交事务,所做的修改将永久保存到数据库中。
我的理解,原子性+隔离性+持久性来达到一致性的目的。

3.1 隔离级别

较低级别的隔离通常可以执行更高的并发,系统的开销也更低的。
Read UnCommitted (未提交读) 事务可以读取未提交的数据,俗称脏读。
Read Committed (提交读) 一个事务开始时,只能“看见”已经提交的事务所做的修改。也叫不可重复读。
Repeatable Read(可重复读)改级别保证了同一个事务多次读取同样的结果是一致的。但没办法解决幻读的问题。某个事务在读时,另一个事务在写。之前事务再读时,会产生幻行。可重复读是MySQL的++默认事务隔离级别++。
Serializable (可串行化) ,是最高的隔离级别。强制事务串行执行,避免幻读。很少用,适用于强调数据一致性,且无并发的情况下。幻读是指,某个事务读取某个范围内的记录时,另一个事务又在该范围内插入新记录,当前事务再读取或修改该范围的记录时,会产生幻行。
总结一下,如下表

事务隔离级别 脏读 不可重复读 幻读
未提交读
提交读
可重复读
可串行化
3.2 死锁

死锁是指多个事务在同一资源上相互占用,并请求锁定对方资源,导致恶性循环的现象。数据库系统实现了各种死锁检测和死锁超时机制。死锁发生后,只有部分或者完全回滚其中一个事务,才能打破死锁。

3.3 事务日志

事务日志和文件系统日志差不多,都是通过追加的方式,写数据时,写操作时先在磁盘的某一块连续的存储区域进行,而不是频繁随机的在磁盘上进行寻址移动。所以,事务日志可以提高事务的效率。并且,事务日志回写磁盘时,能够保证数据正确。

3.4 MySQL中的事务
自动提交

如果不是显式的指定某个事务,MySQL默认一个查询一个事务。 使用变量AUTOCOMMIT来控制。

混合使用存储引擎

事务由存储引擎管理,而不是MySQL服务器。所以同一个事务在不同的存储引擎上式不可靠的。提交不会存在问题,而回滚则会造成麻烦。因为非事务的表数据变更是没法撤销的。这将导致结果不确定。

锁定

InnoDB采用两阶段锁定协议。事务执行过程中,随时可以锁定,但只有COMMIT或者ROOLBACK 的时候,才会释放。

猜你喜欢

转载自blog.csdn.net/niu91/article/details/114555769
今日推荐