事务
事务的四大特性:ACID
在其四大特性中,隔离性又有以下四个隔离级别:读未提交,读已提交,可重复度与串行化
MySQL的基本架构
我们将MySQL分为前端、后端。前端为MySQL Server,例如命令行、图形化界面、JDBC等,他们负责将业务方的业务实际化,然后通过SQL解析器,给到后端的存储引擎,后端负责实际数据的真实存储。
99%都用的InnoDB,它是现在版本的默认存储引擎,早期版本的默认存储引擎为MyISAM
连接池的概念
在前端与后端的连接管理时,运用连接池的概念(Connection Pool)
没有连接池:客户建立连接,进行工作,释放连接,如此反复
有连接池:提前准备好很多连接,就成为连接池,当客户需要一个连接时,从池中取出一个给客户,进行工作,不需要时不去释放,而是放回连接池
可以减少频繁建立/释放连接的成本
故障恢复
与原子性和持久性相关
站在原子性的角度进行考虑,发生故障时,需要进行回滚操作,那么存在两种情况:No-Steal方案与Steal方案。
简单来说No-Steal方案为,当用户没有commit操作时,所有的操作不会持久化到硬盘上,一旦故障因为要保证原子性的原因会自动回滚。
而Steal方案,则代表有些sql在未commit的情况下持久化入硬盘了,所以在发生故障后对外提供服务前,将做的修改回滚。此时做回滚的依据需要记录:哪个事务修改了什么,修改前值是多少,修改后是多少,这些数据必须持久化进硬盘,被称为undo log。
而站在持久性的角度来考虑也存在两种方案:一种为一旦用户进行commit就立即写入,写入后发生故障也影响不大,因为此前数据已经持久化了。另一种为commit时不把所有数据都持久化在硬盘上,等待合适机会一次性写入,此时若发生故障,需要我们故障恢复阶段根据一些信息将修改重新执行一次,写到硬盘上。我们需要在commit并且告诉用户事务执行成功之前,记录下恢复持久性的信息:哪个事务,修改了什么,修改后是什么?这个信息被称为redo log。
我们做出如下图
由此,我们得知MySQL的启动阶段先进行故障恢复,再对外提供服务,而故障恢复依据为undo log与redo log。
并发控制与锁
并发控制模块与隔离性有关。
首先我们需要了解什么叫锁:
锁:与要被访问的数据组合成一个整体,当锁是打开状态,用户访问将其修改为关闭状态,访问完成后再打开,若访问时锁是关闭状态则需要等锁变为打开状态才能访问数据。这么做,保证了一次只有一个人能访问这个数据。
锁的粒度:锁的粒度越细,并发性越好。举个例子解释什么是锁的粒度:一栋楼级别的锁,代表整栋楼只有一把锁,只能允许一个人进入访问,无论他是只坐一把椅子还是打扫一个楼层,别人必须等他做完才能进这个楼,那么如果是一把椅子的锁,那么他坐在一个椅子上,仍然可以有别的用户进入这栋楼坐在别的椅子上进行操作,所以前者粒度粗好实现,后者粒度细但是很难实现。
针对锁,MySQL基于可重复度的隔离级别中存在两种不同的读:
select * from 表 where……;快照读 基于MVCC直接实现,不会加锁,别人仍然可以读取同样的行
select * from 表 where ……for update;当前读 一定读到当前版本,并且对其加锁,避免其他事务操作相同的行
而MVCC:被称为多版本并发控制,是指同时间存在多个事务,看到的是各自的版本
小总结
事务的四大特性:原子性、持久性和隔离性为一致性服务,原子性和持久性与故障恢复模块有关,隔离性与并发控制模块有关。