首页 > 编程知识 正文

mysql事务隔离级别原理,mysql事务隔离级别txisolation

时间:2023-05-06 04:18:11 阅读:286665 作者:3820

隔离性

隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的。
SQL标准中定义了四种隔离级别:

未提交读已提交读可重复读可串行化

下面来详细说明一下这四种隔离级别。

未提交读 (READ UNCOMMITED)

在未提交读这种隔离级别中,对数据的修改,即使还未提交,对其他的事务也是可见的。事务可以读取未提交的数据,也称之为“脏读”,读到的数据被称之为“脏数据”。未提交之前,数据是不准确的,可能会被回滚,也可能还有后续操作的变化。
之前在使用SQLserver时,经常会建议,查询的时候在from子句加上WITH(NOLOCK)。这个关键字的作用就是进行脏读。这是由于在老版本的SQLserver中,是不支持非锁定读的。现在在新版本的SQLserver中可以进行非锁定读了。允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改。

举个栗子:老板给员工发工资,实际发6千,一手抖按了9千,这时员工账户的数据已经发生了更改,但是事务还没提交。员工一查,自己多了3千块钱,以为是涨工资了,过去谢谢老板。老板一看不对啊,我按错了,回滚事务,重新给发6千。小伙纸欲哭无泪。

已提交读(READ COMMITED)

这个隔离级别是大多数操作系统的默认隔离级别,也是平时用的最多的隔离级别。常见的Oracle、SQLserver等,但是MySQL是个例外,MySQL的默认隔离级别是可重复读。已提交读满足前面隔离性的简单定义。一个事务对数据所作的修改,只有到提交之后才能看到。

举个栗子:老板给员工发工资,老板说,我已经给你们发工资了啊,你们查查。然后一众人员一查账户余额都是0 。当转账的事务没有走完的时候,查询出来是没有发生变化的数据。过一会转账事务完成,员工再一查工资,果然到账了。

可重复读(REPEATABLE READ)

该级别保证了在同一个事务中多次读取同样的记录的结果是一致的。相比与可重复读这个隔离级别,已提交读又称为不可重复读。这两个隔离级别有什么区别呢,下面就通过一个例子展示一下。

首先我们建立两个数据库连接

首先切换数据库为test,在这个库中我建立了一个简单的表 t,里面就这些数字。

我们来看一下这个表的隔离级别是什么,使用下面这个命令。可以看到,当前的隔离级别是可重复读

show variables like '%iso%';

我们开启两个事务,在其中一个事务中进行查询,另一个事务进行插入操作。

事务1

事务2

这里两个事务都未提交,首先在事务1中进行查询操作,查询小于7的记录,可以查到1、3、5三条记录。之后再事务2中做了insert操作,插入了记录 2 ,然后再去事务1中查询,显示结果还是1、3、5。然后我们提交一下事务2,可以看到事务1查询出来还是1、3、5。这个事务级别就是可重复读,即使其他事务已经提交,但这个事务中读到的数据还是原先的数据。
如果是已提交读,那么在事务2提交之后,事务1进行查询就会是最新的数据。

可串行化(SERIALIZABLE)

串行化是最高的隔离级别。串行化会在读取的每一行上都加锁,所以可能会导致大量的锁超时和锁争用问题。在实际业务中我们很少使用这个隔离级别。除非是严格要求数据一致性,并且可以接受在没有并发的前提下,我们才会考虑使用这种隔离级别。

总结

这四种隔离级别隔离性从低到高分别是:未提交读、已提交读、可重复读、可串行化。
并发性跟隔离性恰好相反,从低到高是:可串行化、可重复读、可重复读、未提交读。
这也非常好理解,隔离性越高,说明锁的粒度越细。并发性自然就会降低。好比家里有大门、里屋门、柜子门。如果全都加锁,我取完东西在把钥匙给下一个人。这样隔离级别高,但是操作效率肯定慢。反过来,如果都不加锁,大家不用等待钥匙,就可以同时操作一个柜子。并发性高,但是取到的东西就会有些乱。
MySQL的默认隔离级别是可重复读,不是读已提交。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。