MySQL中的事务隔离级别

概述

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交) 、Read committed(读已提交) 、Repeatable read(可重复读取、系统默认的隔离级别) 、Serializable(序列化) 。而且,在事务的并发操作中可能会出现数据更新丢失、脏读、不可重复读、幻读。下面做详细介绍。

事务隔离级别的概念

1、特点:在同一时间有两个或者多个事务同时继续, 同时操作同一份数据
2、隔离级别分类:未读提交、已读提交、可重复读、序列化。如下图所示:
在这里插入图片描述
3、设置以及修改隔离级别

show variables like '%iso%';

局 @@session
全 @@global

set @@session.tx_isolation = 'READ-COMMITTED';
set @@session.tx_isolation = 'REPEATABLE-READ';
事务使用时的问题

1、数据更新丢失( 又被称为事务级联回滚。除了序列化隔离级别没有此问题,其他隔离级别都有的问题)

有两个或多个事务(假设ABC三个事务)同时操作user表里面的的一条记录,具体业务如下:ABC同时查询id为10的一条数据,如果这条数据存在,就做相应的修改操作。
A查询数据存在,修改值,
B查询数据存在,修改值
C查询数据存在,修改值
ABC都查询数据存在,并且也做了相应的修改,但是没有提交事务,锁没有释放。
此时,事务A(或B或C其中一个)在没有提交之前,发生了异常,导致事务回滚,这样会导致另外两个事务也发生异常回滚,另外两个事务之前做的修改值操作部生效。
这就是级联回滚。
导致这种问题的根本原因是事务的原子性,因为三个事务操作的都是同一条数据,所以三个事务被联系在了一起。

备注:级联回滚不是mysql的功能,是开发人员为了保证程序的安全而做的处理。也是人为的手动处理的

2、脏读:一个事务读取了一个另一个事务未提交的数据,就是脏读。事务A读取了事务B更新的数据,然后B回滚操作(未提交的数据),那么A读取到的数据是脏数据。

解决方案:Read committed!读提交,能解决脏读问题。

3、不可重复读:一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
解决方案:Repeatable read !(可重复读)不可重复读对应的是修改,即UPDATE操作。

4、幻读:和不可重复读相比,幻读对应的是插入INSERT操作,而不是UPDATE操作。事务 A 全表扫描读取数据,事务 B 在事务A读取的过程中,对数据作了插入操作并提交,导致事务A读取数据时,多出了一条记录,好像产生了幻觉。
解决方案:1、序列化。2、加一把排他锁,间隙锁

读未提交

1、就是一个事务可以读取另一个未提交事务的数据。
2、问题:容易产生脏读(读了未提交的数据)

读已提交

1、就是一个事务要等另一个事务提交后才能读取数据。
2、产生问题:A事务修改了数据,B事务在A事务修改数据之前和修改数据之后两次读的数据不一致。

Repeatable read(可重复读、数据库默认级别)

1、可重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。
2、产生问题:可重复读,虽然不允许修改,但是可以插入数据,这就容易产生幻读。

序列化

1、Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

在这里插入图片描述

事务隔离级别和锁的关系

1.读未提交:A事务可以读取B事务修改但是未提交的数据,容易产生脏读。

锁原理:其实就是加了一把共享锁,不允许其他事务写,但是可以读。

2、读已提交:A事务不可以读取B事务修改但是未提交的数据。主要是解决脏读问题(但是容易产生 不可重复读问题,未修改前和修改后的数据不一致)。

锁原理:和上面的一样,也是加了一把共享锁,只不过只有A事务修改数据并且提交数据,B事务才可以读数据。容易产生不可重复读问题:A事务提交前和提交后修改了数据,导致B事务两次读的数据结构不不一致。

3、可重复读取:事务A一旦开启了事务,就不允许其他事务做修改操作。但是,允许插入操作。容易产生幻读。

4、序列化:就是一个一个排队。类似队列。‘

锁原理:就是加了一把排他锁,既不允许其他事务读,也不允许其他事务写.。

一般不使用此隔离级别,性能差。遇到幻读问题一般用乐观锁实现,比如队列。

总结

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值