一文读懂mysql的四种事务隔离级别

目录

 

前言

Read Uncommitted 未提交读

Read Comitted 提交读

Repeatable Read 可重复读

SERIALIZABLE 可串行化

总结:


前言

理解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 commitedx
Repeatable readxx
Serializablexxx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值