前言
MySQL有ACID四大特性,本文着重讲解MySQL不同事务之间的隔离性的概念,以及MySQL如何实现隔离性。下面先罗列一下MySQL的四种事务隔离级别,以及不同隔离级别可能会存在的问题。事务隔离级别越高,多个事务在并发访问数据库时互相产生数据干扰的可能性越低,但是并发访问的性能就越差。(相当于牺牲了一定的性能去保证数据的安全性)
下面这张表,展示了MySQL的四大隔离级别和伴随着的一些问题,下面详细介绍。
事务隔离级别
读未提交:多个事务同时修改一条记录,A事务对其的改动在A事务还没提交时,在B事务中就可以看到A事务对其的改动。
读已提交:多个事务同时修改一条记录,A事务对其的改动在A事务提交之后,在B事务中可以看到A事务对其的改动。
可重复读:多个事务同时修改一条记录,这条记录在A事务执行期间是不变的(别的事务对这条记录的修改不被A事务感知)。
串行化:多个事务同时访问一条记录(CRUD),读加读锁,写加写锁,完全退化成了串行的访问,自然不会收到任何其他事务的干扰,性能最低。
不同级别伴随的问题
脏读:A事务在提交前对一个字段的改动会被B事务感知,那么事务之间就很容易产生干扰,假如A对一个字段改动之后被B感知,但是A又回滚了事务,则对该字段的改动依旧保留在B的查询结果中,那么这样的数据就是脏数据(处于处理中间过程的数据)。
不可重复读:A事务对于一条记录的读取结果,在B事务对其修改并提交之后,A再次读取同一条记录会得到不同的结果。
幻读:侧重于A事务的同一个范围查询命令,前后两次得到不同的记录数量,原因是B事务可能对其进行了插入。
小结一下
通过阅读上面给出的内容,可以得到结论:
- 读未提交隔离级别并没有对行数据的可见性做任何限制,所有事务之间的改动都是互相可见的,所以存在很多问题,不推荐使用;
- 串行化隔离级别因为通过锁机制对记录的访问进行限制,所以安全性最高,但并发访问退化成串行访问,性能较低;
因此本文将侧重于探究MySQL如何实现读已提交和可重复读两种隔离级别(也就是你听闻的MVCC多版本并发控制的实现),通过后面的学习你将理解读