admin管理员组文章数量:1487745
Mysql 脏读、不可重复读、幻读
在Mysql中常用的InndDB是支持并发事务的,也就是能够在同一时间允许多个事务对数据库进行操作,那么问题来了,如果一个事务在写数据,另一个事务要读数据会发生什么;如果一个事务在写数据,另一个事务也要写又会发生什么。具体来说,这就有可能产生脏读、不可重复读和幻读。
代码语言:txt复制事务是逻辑上的一组操作,要么全部执行,要么全部不执行
脏读
一个事务读取到了另一个未提交事务修改的数据。这可能导致读取到的数据是无效或错误的,因为那个未提交的事务可能最终会回滚或修改。
例如,事务 A 修改了一条数据但未提交,此时事务 B 读取了这条被修改的数据。如果事务 A 回滚,那么事务 B 读取到的数据就是脏数据。
事务B读取了事务A修改后的数据,但事务A后面回滚,数据回到了修改前,此时事务B手里的数据还是之前的数据,也就是脏数据。
不可重复读
一个事务在执行过程中多次读取同一数据,但是每次读取的结果不一致。这是因为在这个事务执行期间,有其他事务修改了该数据并提交。
比如,事务 A 读取某条数据,事务 B 随后修改并提交了该数据,当事务 A 再次读取时得到了不同的结果。两次读取的结果不一致,因此称为不可重复读。
幻读
一个事务在执行过程中,按照相同的条件进行查询,两次得到的结果集行数不同。这通常是因为在事务执行期间,有其他事务插入或删除了满足条件的数据。
例如,事务 A 按照某个条件查询得到结果集,事务 B 插入了一些符合该条件的数据并提交,当事务 A 再次按照相同条件查询时,结果集的行数增多了,就好像出现了“幻影”的数据。
这里我们有个学生表,初始时有8条数据:
- 事务A在插入前先去看了下不存在主键为9的数据,符合正常逻辑。
- 事务B直接插入了一条主键为9的数据并提交了事务。
- 事务A再去插入发现插入失败,主键冲突,明明刚刚还检查了没有主键为9的,现在却冲突了,就好像出现了“幻影”。事务隔离级别为了解决上面问题,Mysql为我们提供了4种事务隔离级别来解决。隔离级别逐渐上升,性能逐渐下降。
- Read Uncommitted(读未提交):它是性能最好的,事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
- READ COMMITTED(读已提交):允许读取并发事务已经提交的数据,不允许读取另一个并行事务已修改但未提交的数据,避免了“脏读”,但不能避免“幻读”和“不可重复读取”。
- REPEATABLE READ(重复读):保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。Mysql的默认隔离级别,避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”。
- Serializable (串行化):一个事务处理的时候,其他事务都等着。读的时候加共享锁,也就是其他事务可以并发读,但是不能写。写的时候加排它锁,其他事务不能并发写也不能并发读。这样“脏读”、“不可重复读”、“幻读”都能避免了,但此隔离级别性能最低。
本文标签: Mysql 脏读不可重复读幻读
版权声明:本文标题:Mysql 脏读、不可重复读、幻读 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1755046465a3182892.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论