Java面试八股之MySQL事务隔离级别

发布于:2024-07-11 ⋅ 阅读:(15) ⋅ 点赞:(0)
  1. MySQL事务隔离级别

事务与隔离性的基本概念

事务定义:简要介绍事务作为一组逻辑操作单元,必须具备原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability,简称ACID特性)。

隔离性解释:强调隔离性是指在并发事务环境中,事务之间互不影响,如同在单线程环境下执行一样。理想情况下,每个事务都应该看到一个完整的、一致的数据视图,不受其他并发事务影响。

MySQL的四种事务隔离级别

读未提交(Read Uncommitted):

  1. 描述:事务可以读取到其他未提交事务的数据变更,即“脏读”现象。
  2. 示例:事务A修改了一条数据但未提交,事务B在此时读取到了这个未提交的修改结果,如果事务A随后回滚,事务B获取的数据将是无效的。

读已提交(Read Committed):

  1. 描述:事务只能看到已提交的数据,解决了“脏读”问题,但可能出现“不可重复读”(Non-repeatable Read)现象。
  2. 示例:事务A在两次连续读取同一数据期间,事务B对该数据进行了修改并提交,导致事务A两次读取结果不同。

可重复读(Repeatable Read):

  1. 描述:这是MySQL的默认隔离级别。在同一事务内,多次读取同一数据始终返回第一次读取时的结果,解决了“不可重复读”问题,但可能出现“幻读”(Phantom Read)现象。
  2. 示例:事务A在两次执行相同查询期间,事务B插入了符合查询条件的新记录并提交,事务A第二次查询时会看到事务B插入的“幻影”记录。

串行化(Serializable):

  1. 描述:最高级别的隔离,通过严格的锁机制完全避免了“脏读”、“不可重复读”和“幻读”。实际上,它通过锁定数据范围或使用MVCC(多版本并发控制)来模拟串行执行的效果,确保事务之间完全隔离。
  2. 示例:在该隔离级别下,事务A和事务B对相同数据的读写操作将被强制按顺序执行,不会出现任何并发问题,但可能导致严重的性能下降,尤其是在高并发场景下。

优缺点与适用场景

读未提交:

  1. 优点:最低的隔离级别,性能相对较高。
  2. 缺点:脏读风险极高,数据一致性难以保障。
  3. 适用场景:非常罕见,一般不建议在生产环境中使用。

读已提交:

  1. 优点:避免了脏读,适用于大多数对数据一致性要求较高的场景。
  2. 缺点:仍有可能出现不可重复读和幻读,某些业务场景可能不适用。
  3. 适用场景:对性能有一定要求,且业务逻辑能够容忍一定级别并发问题的场景。

可重复读:

  1. 优点:MySQL默认隔离级别,避免了脏读和不可重复读,适合大多数OLTP(在线事务处理)场景。
  2. 缺点:仍有可能出现幻读,且在特定条件下(如长事务)可能导致间隙锁竞争加剧,影响并发性能。
  3. 适用场景:对数据一致性要求较高,且业务逻辑不易受幻读影响的场景。

串行化:

  1. 优点:提供最强的数据一致性保障,完全避免并发问题。
  2. 缺点:并发性能极低,可能导致大量的锁等待和阻塞,影响系统吞吐量。
  3. 适用场景:对数据一致性要求极高的关键业务,如金融交易系统的核心部分,或者在特定时间段(如月末结算)对特定表进行严格串行化处理。

 如果大家需要视频版本的讲解,欢迎关注我的B站: