在 MySQL 中,事务的隔离级别指的是多个并发事务之间的隔离程度,它有四个级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

它们的具体区别如下:

  1. 读未提交(Read Uncommitted)
    1. 特点:最低的隔离级别,事务中的修改,即使未提交,也可以被其他事务读取到。
    2. 优点:并发性能最好,读取到的数据最新。
    3. 缺点:存在脏读(Dirty Read)问题,即读取到未提交的数据,可能导致数据不一致性。
  2. 读已提交(Read Committed)
    1. 特点:保证事务读取到的数据都是已经提交的,其他事务提交的数据对该事务可见。
    2. 优点:避免了脏读的问题。
    3. 缺点:存在不可重复读(Non-Repeatable Read)问题,即同一个事务中,不同时间读取到的数据可能不一样。
  3. 可重复读(Repeatable Read)
    1. 特点:保证同一个事务中,多次读取同一条记录时,读取到的数据都是一致的,MySQL 默认的事务隔离级别。
    2. 优点:避免了不可重复读的问题。
    3. 缺点:存在幻读(Phantom Read)问题,即在一个事务中,两次查询同一个范围的记录,但第二次查询却发现了新的记录。
  4. 串行化(Serializable)
    1. 特点:最高的隔离级别,将所有的事务串行执行,保证了数据的完全隔离。
    2. 优点:避免了幻读的问题。
    3. 缺点:并发性能最差,可能导致大量的锁等待和死锁。

通常情况下,可重复读是一个比较好的选择,能够较好地平衡数据一致性和并发性能。

小结

MySQL 中的事务隔离级别,主要有读未提交、读已提交、可重复度和串行化。这些隔离级别与问题的对应关系如下:

事务隔离级别脏读不可重复读幻读
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)×
可重复读(REPEATABLE READ)××
串行化(SERIALIZABLE)×××

特殊说明

以上内容来自我的《Java 面试突击训练营》,这门课程是有着十几年工作经验(前 360 开发工程师),10 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课。学完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,并且课程配备了 9 大就业服务,帮助上千人找到 Java 工作,其中上百人拿到大厂 Offer,学员最高薪资 70W 年薪,面试课目录和 9 大服务如下:

加我微信咨询:vipStone【备注:训练营】