前言上一篇ACID事务特性博客中我们讲到了隔离性是四大属性里最难、线上事故最多、面试权重最高的核心特性。在高并发业务场景下多事务同时读写数据如果没有隔离规则管控会出现脏读、数据不一致、超卖、重复扣款等严重问题。MySQL为了平衡并发性能与数据安全划分了四大事务隔离级别。一、事务隔离前置基础三大并发读问题1.1 为什么需要隔离级别数据库默认支持多事务并发执行并发读写时会产生三类数据异常问题严重破坏数据隔离性。隔离级别本质就是用来逐级解决这三类并发问题的安全等级。1.2 三大并发问题通俗详解1、脏读Dirty Read定义一个事务正在对一条记录做修改在这个事务完成并提交前这条记录的数据就处于不一致的状态这时另一个事务也来读取同一条记录如果不加控制第二个事务读取了这些“脏”数据并据此作进一步的处理就会产生未提交的数据依赖关系。这种现象被形象的叫做“脏读”。危害对方事务最终回滚当前事务读取的数据虚假无效属于严重数据错误。场景事务A修改余额未提交事务B直接读取到未修改完成的余额A回滚后B读取的数据失效。2、不可重复读Non-Repeatable Read定义一个事务在读取某些数据后的某个时间再次读取以前读过的数据却发现其读出的数据已经发生了改变、或某些记录已经被删除了这种现象就叫做“不可重复读”。诱因中途被其他事务修改并提交数据。区别脏读脏读读未提交数据不可重复读读已提交数据。3、幻读Phantom Read定义一个事务按相同的查询条件重新读取以前检索过的数据却发现其他事务插入了满足其查询条件的新数据这种现象就称为“幻读”。通俗理解改数据叫不可重复读增删数据叫幻读。生产危害库存统计、批量更新、秒杀场景极易出现超卖、数据统计不准问题。脏读读未提交、不可重复读改数据、幻读增减数据。二、MySQL四大隔离级别逐层详解MySQL遵循SQL92标准划分四大隔离级别隔离级别越高、安全性越强、并发性能越差。排序读未提交 读已提交 可重复读 串行化。2.1 读未提交Read Uncommitted最低级别1、核心特性所有事务可以互相读取对方未提交的数据无任何隔离机制。2、存在问题脏读、不可重复读、幻读全部存在。3、底层原理不启用MVCC无数据快照直接读取内存最新数据无任何锁控制。4、生产使用生产彻底禁用无任何业务使用场景仅用于数据库底层测试。总结风险最高、数据最乱线上永远不要碰。2.2 读已提交Read CommittedRC常用级别1、核心特性一个事务只能读取其他事务已经提交的数据看不到未提交数据。2、问题解决情况✅ 解决脏读、 ❌ 存在不可重复读、 ❌ 存在幻读。3、底层MVCC原理面试高频采用MVCC多版本并发控制每次执行SELECT都会生成新读快照Read View。这意味着事务内多次查询会实时读取其他事务提交后的最新数据因此出现不可重复读。4、适用场景Oracle、SQL Server默认隔离级别适合高并发、实时性要求高、不关心事务内数据一致性的业务例如资讯查询、商品列表、实时榜单。总结杜绝脏读数据实时性强适合高并发查询业务缺点是同一事务数据不稳定。2.3 可重复读Repeatable ReadRRMySQL默认级别1、核心特性同一个事务中多次读取同一条数据结果永远一致不受其他事务修改提交影响。2、问题解决情况✅ 解决脏读、 ✅ 解决不可重复读、 ❌ 存在幻读。3、底层MVCC原理重中之重事务第一次执行SELECT时生成读快照Read View后续所有查询复用同一个视图。哪怕其他事务修改并提交数据当前事务依旧读取首次快照数据保证可重复读。4、MySQL特殊优化标准SQL的RR级别存在幻读事务中,执行更新之后,再查询,查询到最新的其他事务提交的数据但InnoDB引擎通过间隙锁临键锁在加锁更新场景下规避幻读(后续会做详细讲解)。5、适用场景MySQL默认级别适合支付、订单、账务、库存等事务内数据要求稳定、不能反复变动的核心业务。总结平衡性能与安全绝大多数业务通用唯一瑕疵是快照读存在幻读。2.4 串行化Serializable最高安全级别1、核心特性事务强制串行执行读写互相阻塞完全放弃并发能力。2、问题解决情况✅ 脏读、✅ 不可重复读、✅ 幻读全部解决。3、底层原理废弃MVCC全程使用表级锁读加共享锁、写加排他锁读写互斥。4、优缺点优点数据绝对安全无任何并发异常缺点并发极低、极易锁等待、死锁频发、性能极差。5、适用场景极低并发、对数据一致性要求极致严苛的金融清算、对账、核心结算业务。总结安全天花板性能地板线上极少使用。三、四大隔离级别对照表面试必背隔离级别脏读不可重复读幻读并发性能默认引擎读未提交存在存在存在最高无读已提交(RC)不存在存在存在较高Oracle可重复读(RR)不存在不存在存在(特殊优化)中等MySQL串行化不存在不存在不存在极低无附极简思维导图隔离级别排序读未提交(废弃) → 读已提交(高并发) → 可重复读(默认通用) → 串行化(极致安全)底层核心差异RC每次查询生成新Read ViewRR首次查询生成且复用视图串行化废弃MVCC使用表锁。生产口诀查询用RC、业务用RR、对账用串行、脏读要杜绝、幻读靠加锁。