问题详情
什么是脏读、不可重复读、幻读?如何解决?
不可重复读:不可重复读是指在一个事务中,同一查询在不同的时间内返回了不同的结果。解决方法可以是设置事务的隔离级别为串行化或通过行级锁来避免不可重复读的发生。
幻读:幻读是指在一个事务中,在某个范围内执行了两次查询,第二次查询看到了第一次查询没有看到的行。解决方法可以是设置事务的隔离级别为串行化或使用行级锁或间隙锁来避免幻读的发生。同时在写操作前加锁或使用乐观锁亦可避免幻读的问题。
-
上一篇
什么是脏读、不可重复读、幻读?如何解决?
<p>一、<strong>先来介绍一下事务</strong></p><p>事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位。其执行的结果将使数据库从一种一致性状态变迁到另一种一致性状态。事务是逻辑上是一个最小的原子单位,要么全部执行,要么全部不执行。</p><p><br></p><p>二、<strong>事务的四大特征(ACID)</strong></p><p>1.<strong>原子性(</strong>Atomicity<strong>)</strong>: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用</p><p>2.<strong>一致性(</strong>Consistency<strong>)</strong>: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的。</p><p>3<strong>.隔离性(</strong>Isolation<strong>)</strong>: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的</p><p>4.<strong>持久性(</strong>Durability<strong>)</strong>: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响</p><p><br></p><p>三、<strong>事务隔离级别</strong></p><p>1.<strong>读未提交(read-uncommitted)</strong>: 脏读(未解决) 不可重复读(未解决) 幻读(未解决)</p><p>2.<strong>不可重复读(read-committed)</strong>: 脏读(已解决) 不可重复读(未解决) 幻读(未解决)</p><p>3.<strong>可重复读(repeatable-read)</strong>: 脏读(已解决) 不可重复读(已解决) 幻读(未解决)</p><p>4.<strong>串行化(serializable)</strong>: 脏读(已解决) 不可重复读(已解决) 幻读(已解决)</p><p><br></p><p>注意:在 MySQL 中默认的事务隔离级别是 <strong>可重复读</strong>。InnoDB 存储引擎在 <strong>可重复读 </strong>隔离级别下也已经解决了幻读(通过 LBCC 和 MVCC 来解决幻读问题)。</p><p><br></p><p>四、<strong>脏读、不可重复读、幻读</strong></p><p>1、<strong>脏读</strong>:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据</p><p>2、<strong>不可重复读</strong>:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。</p><p>3、<strong>幻读</strong>:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。</p><p><br></p><p><strong>注意</strong>:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表</p>
-
下一篇
什么是脏读、不可重复读、幻读?如何解决?
什么是脏读、不可重复读、幻读?如何解决?
相关文章
- PHP7和PHP5的性能上有什么差别?
- 请给一个例子解释一下PHP中的闭包函数是什么?
- PHP中常用的设计模式有哪些?
- 请描述在Golang中使用MongoDB时的最佳实践。
- 请提供至少三个通过PHP实现的网站性能优化技巧。
- 请解释下PHP中会话(session)和Cookie(cookie)的作用。
- PHP中如何进行单元测试以及如何在开发过程中保证代码质量?
- PHP中如何处理文件上传和下载?
- 请举例说明PHP中如何处理异常?
- 请谈谈您对PHP的垃圾回收机制的了解及实践。
- 请解释什么是defer语句,以及它有什么作用?
- 请问PHP中如何实现多线程?
- 在PHP中,Magic Method都有哪些,并举例说明它们的作用?
- 请列出与PHP相关的缓存机制及其优缺点。
- 如何在Golang中进行并发编程?
- 请解释一下PHP中的MVC模式是如何工作的?
- 聊一下高并发和高性能的区别和联系?
- 如何在Golang中实现单例模式?
- 如何通过PHP来保护您的代码免受SQL注入攻击?
- 请解释HTTP的基本概念,以及在Golang中如何使用HTTP?
微信收款码
支付宝收款码