Java事务四种隔离级别本质是数据库对读一致性的分级保障:读未提交允许脏读、不可重复读和幻读,性能最高;读已提交避免脏读但仍有不可重复读和幻读;可重复读避免前两者,MySQL通过MVCC+Next-Key Lock抑制幻读;串行化彻底避免所有并发问题,但以严重牺牲并发性能为代价。

Java 事务中的四种隔离级别,本质是数据库在并发场景下对“读一致性”的不同保障程度。它们不是 Java 自己定义的,而是 JDBC 将 SQL 标准的隔离语义透传给底层数据库,并由数据库(如 MySQL、Oracle、PostgreSQL)实际实现。理解的关键不在于背名称,而在于看清每级**放开了什么问题、锁住了什么行为、付出了什么代价**。
读未提交(Read Uncommitted)
这是最低隔离级别,事务可以读到其他事务还没提交的数据。
- 允许脏读:比如事务 B 修改了某条记录但还没提交,事务 A 此时读到了这个“中间态”值;如果 B 后续回滚,A 就读到了根本不存在的数据
- 不可重复读和幻读自然也存在
- 几乎不加锁,性能最高,但业务上极少使用——连基本数据可信度都难保证
读已提交(Read Committed)
事务只能读到其他事务已经提交的数据,这是 Oracle 的默认级别。
- 避免脏读:每次 SELECT 都会读取最新的已提交快照(依赖 MVCC 或行级共享锁)
- 但不保证可重复读:同一事务中两次查询同一条记录,可能因其他事务中途提交修改而得到不同结果
- 幻读也可能发生:比如第一次查 age > 25 有 3 条,其他事务插入一条满足条件的新记录并提交,第二次再查就变成 4 条
可重复读(Repeatable Read)
MySQL 默认级别,目标是让一个事务内多次读取同一行或同一范围的结果保持一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 避免脏读和不可重复读:基于 MVCC(多版本并发控制),事务启动时生成一致性视图,后续读都基于该快照
- 幻读在部分场景仍存在:普通 SELECT 不加锁,其他事务 insert + commit 后,当前事务再次范围查询可能看到新行;但 MySQL 用 Next-Key Lock(行锁 + 间隙锁)在 UPDATE/DELETE 范围操作中抑制幻读
- 比读已提交更严格,但未达绝对安全
串行化(Serializable)
最高隔离级别,强制事务按某种顺序串行执行,彻底消除所有并发异常。
- 完全避免脏读、不可重复读、幻读:对读操作也加锁(如范围锁或表级锁),或通过严格的调度器控制执行顺序
- 本质是用并发换一致性:事务之间高度互斥,响应延迟上升,吞吐下降明显
- 适合极少数强一致性场景,比如金融核心账务核对、库存超卖零容忍等,日常业务慎用
选哪个级别,得看业务能否容忍哪类不一致,以及系统能否承受对应开销。大多数 Web 应用用读已提交就够用;对一致性要求高的模块,可局部提升到可重复读;串行化不是“更好”,而是“更重”——它解决所有问题的方式,就是不让问题发生。

















