MySQL:事务中的四个隔离级别

SQL标准中对事务的四个隔离级别

数据库中多个事务并发可能会产生脏写、脏读、不可重复读、幻读这几种问题。针对这些多事务并发的问题,实际上SQL标准中规定了事务的几种隔离级别,用来解决这些问题。

在SQL标准中规定了4种事务隔离级别,就是说多个事务并发运行的时候,相互是如何隔离的,从而避免一些事务并发的问题。

  • read uncommited(读未提交)
  • read commit(读已提交)
  • repeatable read(可重复读)
  • serializable(串行化)

读未提交

第一个read uncommitted隔离级别,是不允许发生脏写的

也就是说,不可能两个事务在没提交的情况下去更新同一行数据,但是这种隔离级别下,可能发送脏读、不可重复读、幻读

因此,实际开发中这个级别基本不用

读已提交

第二个是read committed隔离级别,也叫做RC。这个级别下,不会发生脏读和脏写

也就是说,别的事务没提交的情况下,你是绝对读不到的。但是可能会发生不可重复读和幻读问题,因为一旦别的事务修改了值然后提交了,你事务是会读到的,所以可能你多次读到的值是不同的

可重复读

第三个是REPEATABLE READ隔离级别,就是可重复读级别,也叫做RR

这个级别下,不会发生脏写、脏读和不可重复读。因为一个事务多次查询一个数据的值,哪怕别的事务修改了这个值还提交了,没用,你不会读到人家提交事务修改过的值,事务一旦开始,多次查询一个值,会一直读到同一个值

举个例子:

  • 一个事务A,第一次查询一行数据的值是A

在这里插入图片描述

  • 接着事务B修改了这行数据的值为B,还提交了
    在这里插入图片描述
  • 接着事务A再次查询这行数据的值,读到的还是值A。

在这里插入图片描述

但是会发生幻读

因为假设你一次SQL是根据条件查询,比如“select * from table where id > 10”,第一次查出来10条数据,结果另外一个事务插入了一条数据,下次你可能会查出来11条数据,还是会有幻读问题的。

RR级别,只不过保证对同一行数据的多次查询,你不会读到不一样的值,人家已提交事务修改了这行数据的值,对你没有影响。

串行级别

这种级别,根本就不允许你多个事务并发执行,只能串行起来执行,先执行事务A提交,然后执行事务B提交,接着执行事务C提交,所以此时你根本不可能有幻读的问题,因为事务压根儿都不并发执行!

实际上基本不用,因为单个事务串行,那数据库性能就会很差

小结

最常用的是RC和RR级别,其他两种基本不用

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值