MySQL事务的隔离级别

事务的隔离级别是数据库管理系统中的关键概念,旨在处理并发操作带来的问题,如脏读、不可重复读和幻读。本文通过实例解释了四种隔离级别:读未提交、读已提交、可重复读和串行化,以及它们如何影响并发操作。脏读、不可重复读和幻读分别举例说明,并探讨了解决这些问题的策略。通过对事务隔离级别的理解,可以更好地设计和优化数据库系统的并发性能。
摘要由CSDN通过智能技术生成

要了解事物的隔离级别,先从事物说起事务是数据库中的一个核心概念,指的是对数据库的一组操作作为一个整体,要么都执行要么都不执行。
在这里插入图片描述

事务有四大特性:

1. 原子性:
每个事务都是一个整体,不可再拆分,事务中的sql语句要么都执行成功,要么都执行失败。
2. 一致性:
事务执行前后数据库的状态保持一致。比如不管如何转账,转账前后的总钱数是不变的。
3. 隔离性:
事务和事务之间不应该相互影响,保持隔离。
4. 持久性:
事务一旦提交对数据库的修改就是永久的,即使电脑发生故障也不会影响该修改,因为他的结果是记录在存储设备上的。

事务中有一个重要的特性“事务的隔离性”指的是事务和事务之间不应该相互影响,保持隔离,然而在现实中多个事务可能会操作同一个数据,造成并发问题:
1. 脏读: 一个事务读取到了另一个事务尚未提交的数据。

2. 不可重复读: 事务一读取到了age的值20,事务二将该值修改成了28,事务一再次读取age的值28,事务一两次读取的age值不一致。

3. 幻读: 事务一读取到A表中有一条记录,事务二往A表中插入一条记录,事务一再次读取的时候记录变成了两条,就像发生幻觉一样。

不可重复读和幻读很相似,可以从两个角度理解两者的差别:

  1. 不可重复读是另一个事务修改了数据,导致该事务多次读取出来的值不一样,而幻读是另一个事务插入或删除了记录,导致该事务多次读取出来的记录数不一样
  2. 不可重复读的解决只需要锁住会发生修改的记录就可以,幻读需要锁住更大的范围。

正是因为有这些问题存在,数据库设置了隔离级别来处理:

1. 读未提交(read uncommitted):
事务中的修改,即使没有提交,其他事务也可以看得到在这种隔离级别下有可能发生胀读,不可重复读和幻读。

一家酒店对外预定房间,现在还剩四间房,一个顾客到小王这里来预定四间房,小王查询系统发现还剩四间就将这四间房预定出去,该事务还没提交的时候另一个顾客到小李这里来预定房间,小李查询系统发现没房了,就拒绝了这个订单,此时小王的电脑发生故障,事务回滚,订单失效,这就是脏读造成的影响。

2. 读已提交(read committed):
事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下有可能发生不可重复读和幻读。

还是定房间的例子,一个顾客到小王这里来预定四间房,小王将这四间房预定了出去,该事务还没提交的时候另一个顾客到小李这里来预定房间,小李查询系统发现还有四间房,刚想预定的时候小王的事务提交了,小李的系统立马呈现0间房。这就是不可重复读造成的影响。

3. 可重复读 (repeatable read):
该级别保证了在事务中看到的每行的记录的结果是一致的,但是这种级别下有可能发生幻读。

公司规定如果销售额达不到就要扣工资,经理查询小王的销售业绩,发现还差几间房,经理喜上眉梢,把结果打印出来,结果打印出来的结果业绩正好合格,原来小王在这当口又卖了几张票正好填上了这个空缺。这就是幻读造成的影响。

4. 串行化(serializable):
该级别下所有的事务都是串行执行的,一个事务执行完了才能执行其它的事务,可以解决所有的并发问题,它是靠大量加锁实现的,所以效率很低下。只有在需要绝对保证数据一致性,并且并发量不大的情况下,可以考虑。

感谢作者:夏昊
来源:知乎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值