主题切换
MySQL并发事务与隔离级别笔记
一、并发事务的定义
并发事务是指多个事务同时对数据库中的数据进行读写操作的场景。在高并发系统中,多个事务并行执行可以提高系统吞吐量,但也会带来数据一致性问题,需要通过事务隔离机制来解决。
二、并发事务带来的问题
1. 脏读
一个事务读取到了另一个事务还没有提交的数据。如果后续另一个事务回滚,读取到的数据就是无效的。
2. 不可重复读
一个事务先后两次读取同一条记录,但两次读取的数据不同。这是因为在两次读取之间,其他事务修改并提交了该数据。
3. 幻读
一个事务按照条件查询数据时,没有找到对应的数据行,但在插入数据时,发现该行数据已经存在,仿佛出现了“幻影”。通常发生在范围查询场景,其他事务插入了符合条件的数据。
三、事务隔离级别
为了解决并发事务问题,数据库提供了四种隔离级别,级别越高,数据安全性越高,但性能越低。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| Read Uncommitted(未提交读) | ✅ | ✅ | ✅ | 最低级别,允许读取未提交数据,性能最高 |
| Read Committed(读已提交) | ❌ | ✅ | ✅ | 仅允许读取已提交数据,解决脏读 |
| Repeatable Read(可重复读) | ❌ | ❌ | ✅ | 同一事务内多次读取同一数据结果一致,解决脏读和不可重复读 |
| Serializable(串行化) | ❌ | ❌ | ❌ | 事务串行执行,完全避免并发问题,性能最低 |
四、MySQL的默认隔离级别
MySQL的InnoDB存储引擎默认的隔离级别是Repeatable Read(可重复读)。
- 该级别解决了脏读和不可重复读问题,同时在InnoDB中,通过Next-Key Lock(间隙锁)机制,在大部分场景下也避免了幻读问题。
- 是数据安全性和性能之间的平衡选择,适合大多数业务场景。
面试相关问题
问:什么是并发事务?会带来哪些问题? 答:并发事务是多个事务同时读写数据库数据的场景,会带来脏读、不可重复读、幻读三种问题。
问:如何解决并发事务问题?MySQL的默认隔离级别是什么? 答:通过设置事务隔离级别解决,MySQL默认隔离级别是Repeatable Read(可重复读)。
问:脏读、不可重复读、幻读的区别是什么? 答:脏读是读取到未提交数据;不可重复读是同一事务两次读取同一数据结果不同;幻读是同一事务范围查询时数据行数不一致。
问:不同隔离级别能解决哪些问题? 答:Read Uncommitted无法解决任何问题;Read Committed解决脏读;Repeatable Read解决脏读和不可重复读;Serializable解决所有问题。
问:为什么MySQL默认使用可重复读隔离级别? 答:可重复读在保证数据一致性(解决脏读、不可重复读)的同时,性能开销较低,且InnoDB通过间隙锁机制进一步避免了幻读问题,是安全性和性能的平衡选择。