目录
前言
理解mysql的四种事务隔离级别的前提,需要理解什么是事务。不知道的请移步,先理解什么是事务:什么是事务。
mysql的四种事务隔离级别,描述的是事务与事务之间的相互影响与否,以及会怎样影响的关系。
我们首先举个例子,以便后面容易理解。现在我们有两个事务,每个事务呢又做了几件事情。
Read Uncommitted 未提交读
脏读是指一个事务在处理数据的过程中,读取到另一个未提交事务的数据。
例子1:
比如学生表中张三的作业完成进度最初为60%。事务A中要做的事情1就是去读取学生表中张三的作业完成进度,但是事务B发生在前,事务B的事情4修改了进度为70%。事情的诡异就在这里了,此时事务B虽然未提交,但是事务A任然会读取到进度为70%。对我们的程序影响在于,如果事务B不提交了,回滚了,那么明显的事务A中读取的数据就是错误的。这种现象我们称之为脏读(Dirty read)
Read Comitted 提交读
提交读(不可重复读)是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。
例子2:
比如学生表中张三的作业完成进度最初为60%。事务A中事情1读取到的进度为60%,然后马上事务B把进度修改为70%,并提交了。虽然事情1事情2在同一个事务中,但是事情2再次读取到的进度为70%,两个结果并不一致,我们称之为不可重复读问题。提交读虽然在这种情况下不一致,但是解决了例子1中脏读问题。
Repeatable Read 可重复读
可重复读存在的问题就是,其他事务如果添加行,那么当前事务会把此行读取到。当然可重复读解决了脏读和不可重复读问题。
例子3:
事务A 中事情1要做的是读取年龄大于18且小于20岁的所有学生信息,这时,读取的结果只有张三李四两个人。此时事务B添加了一个学生,这个学生正好19岁,叫王五,并提交了事务B。这时,事务A中事情2又做了同样的事情,读取年龄大于18且小于20岁的所有学生信息,但是问题出来了,此时读取结果是张三李四王五三个人。这个问题我们称之为幻读。
mysql默认为可重复读。
SERIALIZABLE 可串行化
这种级别就是最高了,解决了脏读,不可重复读,幻读问题。
总结:
需要注意的一点的是,不是说我们都使用可串行化就可以了,因为它最严谨嘛。事实并不是这样,越严谨开销越大,能支持的并发越小。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommited | ✔ | ✔ | ✔ |
Read commited | x | ✔ | ✔ |
Repeatable read | x | x | ✔ |
Serializable | x | x | x |