前置说明
最近在看MySQL的常见面试题, 简单记录一下.
四种隔离级别对比
主要为了保证ACID中的隔离性, 一致性是目的. 原子性, 隔离性, 持久性都是手段.
隔离级别 | 脏读(Dirty Read) | 幻读(Phantom Read) | 不可重复读(Non-repeatable Read) |
---|---|---|---|
Read Uncommitted | 可能发生 | 可能发生 | 可能发生 |
Read Committed | 不会发生 | 可能发生 | 可能发生 |
Repeatable Read | 不会发生 | 可能发生 | 不会发生 |
Serializable | 不会发生 | 不会发生 | 不会发生 |
注:可能发生表示在该隔离级别下可能出现该问题。不会发生表示在该隔离级别下不会出现该问题。
需要注意的是,不同的隔离级别会在并发性能和数据一致性之间做出不同的权衡。随着隔离级别的提高,数据库的并发性能通常会降低,但数据的一致性会得到更好的保证。选择合适的隔离级别需要根据应用的需求来进行权衡。
读未提交(READ UNCOMMITTED)级别,事务中的读取操作可以看到未提交事务的修改。因此,脏读可能发生。同时,由于其他事务的修改也可能影响数据,幻读和不可重复读都可能发生。
读已提交(READ COMMITTED)级别,事务中的读取操作只能看到已提交事务的修改。因此,脏读不可能发生。但是,幻读和不可重复读仍然可能发生。
可重复读(REPEATABLE READ)级别,MySQL默认的隔离级别. 事务中的读取操作在同一个事务中多次读取同一行数据时,结果始终一致,除非事务本身发生了修改。因此,不可重复读不可能发生。但是,幻读仍然可能发生。
可串行化(SERIALIZABLE)级别,事务串行化顺序保证了对事务的隔离性。因此,脏读、幻读和不可重复读都不可能发生。但是,该级别的性能开销较大,因为事务通常需要等待前一个事务完成,才能继续执行。
三种问题
-
脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。这可能导致读取到无效或不一致的数据。
-
幻读(Phantom Read):一个事务在读取某个范围的数据时,另一个事务在该范围内插入了新的数据,导致第一个事务重新读取该范围的数据时,发现有新的数据出现。文章来源:https://www.toymoban.com/news/detail-639370.html
-
不可重复读(Non-repeatable Read):一个事务在读取某个数据后,再次读取该数据时,发现数据已经被其他事务修改或删除。文章来源地址https://www.toymoban.com/news/detail-639370.html
到了这里,关于MySQL的四个隔离级别对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!