在 MySQL 中,事务的隔离级别指的是多个并发事务之间的隔离程度,它有四个级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
它们的具体区别如下:
- 读未提交(Read Uncommitted)
- 特点:最低的隔离级别,事务中的修改,即使未提交,也可以被其他事务读取到。
- 优点:并发性能最好,读取到的数据最新。
- 缺点:存在脏读(Dirty Read)问题,即读取到未提交的数据,可能导致数据不一致性。
- 读已提交(Read Committed)
- 特点:保证事务读取到的数据都是已经提交的,其他事务提交的数据对该事务可见。
- 优点:避免了脏读的问题。
- 缺点:存在不可重复读(Non-Repeatable Read)问题,即同一个事务中,不同时间读取到的数据可能不一样。
- 可重复读(Repeatable Read)
- 特点:保证同一个事务中,多次读取同一条记录时,读取到的数据都是一致的,MySQL 默认的事务隔离级别。
- 优点:避免了不可重复读的问题。
- 缺点:存在幻读(Phantom Read)问题,即在一个事务中,两次查询同一个范围的记录,但第二次查询却发现了新的记录。
- 串行化(Serializable)
- 特点:最高的隔离级别,将所有的事务串行执行,保证了数据的完全隔离。
- 优点:避免了幻读的问题。
- 缺点:并发性能最差,可能导致大量的锁等待和死锁。
通常情况下,可重复读是一个比较好的选择,能够较好地平衡数据一致性和并发性能。
小结
MySQL 中的事务隔离级别,主要有读未提交、读已提交、可重复度和串行化。这些隔离级别与问题的对应关系如下:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ UNCOMMITTED) | √ | √ | √ |
读已提交(READ COMMITTED) | × | √ | √ |
可重复读(REPEATABLE READ) | × | × | √ |
串行化(SERIALIZABLE) | × | × | × |
特殊说明
以上内容来自我的《Java 面试突击训练营》,这门课程是有着十几年工作经验(前 360 开发工程师),10 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课。学完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,并且课程配备了 9 大就业服务,帮助上千人找到 Java 工作,其中上百人拿到大厂 Offer,学员最高薪资 70W 年薪,面试课目录和 9 大服务如下:
加我微信咨询:vipStone【备注:训练营】