MySQL总结
MySQL总结
1. 名词解释:
事务:事务(Transaction)是有一条或者多条对数据库操作的SQL语句所组成的一个不可分割的整体。只有事务中的所有操作都操作完成,才将整个事务提交的数据库,如果执行过程中有部分事务失败,那么事务就要回滚到最初的状态,也就是事务具有原子性。因此,事务要么全部执行完成,要么全部不执行。
原子性(atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性(durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
读未提交(Read-Uncommited) : A在事务执行过程中能够读取到B事务还未提交时,B事务中的执行操作(脏读)。属于最低的事务隔离级别。
读已提交(Read-Commited):A事务在执行过程中读取到的是B事务已经提交的内容,因为只能读取到其他事务提交的内容,因此解决了脏读。但是如果在A事务修改数据提交成功前后分别读取数据会存在不一致的情况(不可重复读),是比读未提交更高的隔离级别
可重复读(repeatable-read):可重复读的含义在于强调同一个事务A读取同一个条数据的结果,肯定是一致的,保证数据在A事务中读取多次结果一致。但是当B事务插入了新的数据,此时我们再对数据进行更新或者插入时,发现和第一次读取到的数据不一致,产生幻读。 是比读已提交更高的隔离级别
串行化(Serializable):最高的隔离级别,要求事务都串行执行,因此执行的效率最低,但是可靠性也是最好的,不会出现上述的脏读,不可重复读,以及幻读。
脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读:事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行。
基于锁的属性分类:共享锁、排他锁。
基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)。
基于锁的状态分类:意向共享锁、意向排它锁
共享锁(Share Lock):又称读锁,简称S锁。当一个事务对数据加上读锁之后,其他事务只能对该数据加读锁,而无法对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加写锁。
排他锁(eXclusive Lock):又称写锁,简称X锁;当一个事务对数据加上写锁之后,其他事务将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。
表锁:上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;特点: 粒度大,加锁简单,容易冲突;
行锁:对所有行级别锁的一个统称,比如下面说的记录锁、间隙锁、临键锁都是属于行锁, 行锁是指加锁的时候锁住的是表的某一行或多行记录,多个事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;特点:粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发要高;
记录锁(Record Lock):属于行锁中的一种,记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录。触发条件:精准条件命中,并且命中索引;
间隙锁(Gap Lock):属于行锁中的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。
临键锁(Next-Key Lock):也属于行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。
状态锁包括意向共享锁和意向排它锁,把他们区分为状态锁的一个核心逻辑,是因为这两个锁都是描述是否可以对某一个表进行加表锁的状态。当一个事务试图对整个表进行加锁(共享锁或排它锁)之前,首先需要获得对应类型的意向锁(意向共享锁或意向共享锁)
意向共享锁: 当一个事务试图对整个表进行加共享锁之前,首先需要获得这个表的意向共享锁。
意向排他锁: 当一个事务试图对整个表进行加排它锁之前,首先需要获得这个表的意向排它锁。
MVCC:多版本并发控制,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本。
快照读:读取数据的时候会根据一定规则读取事务可见版本的数据(可能是过期的数据),不用加锁。
当前读:读取的是最新版本, 并且对读取的记录加锁,保证其他事务不会再并发的修改这条记录,避免出现安全问题。
2. 关系
事务特性 | 实现方式 |
原子性 | undo log |
隔离性 | MVCC |
持久性 | redo log |
一致性 | 原子性+隔离性+持久性 |
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 会 | 会 | 会 |
读已提交 | 不会 | 会 | 会 |
可重复读 | 不会 | 不会 | 会 |
串行化 | 不会 | 不会 | 不会 |