五种常见的并发异常

◦ 第⼀类丢失更新(某⼀个事务的回滚,导致另⼀个事务已更新的数据丢失。)

◦ 第⼆类丢失更新(某⼀个事务的提交,导致另⼀个事务已更新的数据丢失。)

◦ 脏读(某⼀个事务,读取了另外⼀个事务未提交的数据。)

◦ 不可重复读(⼀个事务对同⼀个数据前后读取结果不⼀致。)

◦ 幻读(某⼀个事务,对同⼀个表前后查询到的⾏数不⼀致。)


Mysql的四种隔离级别

SQL标准定义了4类隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

————————————————————————————————

Read Uncommitted(读取未提交内容)

所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

————————————————————————————————

Read Committed(读取提交内容)

一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

————————————————————————————————

Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

————————————————————————————————

Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。


👇看完例子你就懂了

可以看到每一个机制都有多多少少的问题,不会有一个机制能满足所有业务的可见不可见问题。读取提交内容机制支持不可重复读“异常”,但是有的业务就是需要“不可重复读”。 比如,你朋友找你借钱,你看你钱包还有1000块,打算接你朋友500元,然后淘宝先到后付这时扣了你500块(你还没转账),那这个时候不可重复读就不是异常了

没有 “最好的隔离级别”,只有 “最适合当前业务的隔离级别”

那这个时候又有疑问了,那他同一个事务读到了两个值,那事务的隔离性在哪里?
补充一下,事务的特点原子性,一致性,隔离性,持久性)
答:事务隔离性的核心是:多个事务并发执行时,彼此的影响需要被控制在合理范围内,但不同隔离级别对 “合理范围” 的定义不同。

总结:第一类 / 第二类丢失更新真的是异常,脏读、不可重复读、幻读根据具体的业务需求来定

脏读、不可重复读、幻读: 它们的存在与隔离级别的设计直接相关,是否构成异常取决于业务对 “数据稳定性” 的需求: 若业务允许数据动态变化(如实时统计、即时通信),这些现象是合理的; 若业务需要 “事务内数据绝对稳定”(如财务对账、订单确认),则需要更高隔离级别。

​ 第一类 / 第二类丢失更新: 这是并发控制机制的底层错误,与业务场景无关 —— 任何业务都不允许数据被无故覆盖或丢失,必须通过锁、MVCC 等机制彻底避免(现代数据库已基本解决这类问题)。

posted on 2025-06-20 16:17  MyLover_Jinsol  阅读(12)  评论(0)    收藏  举报