Mysql事务的隔离级别

本文详细介绍了数据库事务的ACID特性,包括原子性、一致性、隔离性和持久性,以及四种事务隔离级别:读未提交、读已提交、可重复读和序列化,解析了它们如何防止脏读、不可重复读和幻读等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 简介

事务,所谓事务是用户定义的一个数据操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。


二、事务的四个基本特性(ACID)

事务具有4个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性简称为 ACID特性(ACID properties)。

(一)原子性

事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节,事务是一个不可分割的整体。

(二)一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。也就是其它事务不可能会访问到这个事务状态变换的中间过程。例如,某公司在银行中有 A, B 两个账号,现在公司想从账号 A 中取出 10000 元存入账号 B 。那么事务可以定义为如下两个操作:操作1,从账号 A 中减去 10000 元;操作2,向账号 B 中加入 10000 元。这个事务的执行不可能会出现账号 A 扣了钱,而账号 B 未到账的情况

 注意:原子性和一致性的区别是,原子性注重的是结果,而一致性注重的状态

(三)隔离性

一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。例如,事务 A 正在从一张银行卡中取钱,在事务 A 取钱的过程结束之前,B不能向这张卡转账。

(四)持久性

事务一旦提交,它对数据库中的数据的改变是永久的,无法回滚。


三、事务的隔离级别

之所以需要设置数据库的事务隔离级别是为了预防事务并发所导致的几种程度的不同的问题。

(一)事务并发问题

1、脏读:事务 A 和 事务B 同时操作数据,在事务A 读取完数据后,事务 B 对数据进行了修改,导致事务 A 读取到了脏数据(失效的数据)

2、不可重复读:事务 A 在执行过程中需要多次读取某数据。事务 B 在事务 A 多次读取数据的间隔中,对数据进行了修改并提交,导致事务 A 多次读取同一数据但结果不一致的情况。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

注意:不可重复读侧重于修改,而幻读侧重于新增和删除,解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

(二)四种事务隔离级别

1、读未提交(read uncommitted),顾名思义,就是一个事务可以读取另一个未提交事务的数据。

基础问题:读未提交造成了“脏读”问题,解决办法就是read committed,读已提交。

2、读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据。

进阶问题:读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读

那怎么解决可能的不可重复读问题?Repeatable read !

3、可重复读(Repeatable read),就是事务一旦开启,所访问到的数据,不允许其他事务对其进行修改。因此避免了不可重复读的问题,

进阶问题:例如,现在事务 A 把学生成绩表中的具体分数改成ABCDE等级制,事务B却插入了一条具体分数的记录。事务 A 在此读取表数据发现表中同时出现百分制和等级制的情况。这种情况称为幻读。

序列化可以用来解决这个问题,

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

事务隔离级别脏读不可重复读幻读
读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行化(Serializable)

(三)常用数据库支持的事务隔离级别

Oracle读已提交(默认) 和 序列化
Mysql读未提交、读已提交、可重复读(默认)、序列化
Sql Server除以上提到的四种事务隔离级别还支持SNAPSHOT(快照)、READ COMMITTED SNAPSHOT(已经提交读隔离),默认是读已提交

四、总结

一直对这个基础的知识理解不清晰,趁着今天有空重新学习下以加深印象,在撰写文章的过程中参考了一下这两篇文章。

https://blog.youkuaiyun.com/qq_33290787/article/details/51924963

https://www.cnblogs.com/huanongying/p/7021555.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值