26

这个oracle java 教程:

当事务 A 检索一行,事务 B 随后更新该行,事务 A 稍后再次检索同一行时,就会发生不可重复读取。事务 A 两次检索同一行但看到不同的数据。

脏读和不可重复读有什么区别?这不是一回事吗?由于其他人的更新而读取错误的结果?

提前致谢。

4

4 回答 4

24

完全相同的页面解释了脏读是什么:

访问尚未提交的更新值被视为脏读,因为该值有可能回滚到其先前的值。如果您读取一个稍后回滚的值,您将读取一个无效值。

因此,不可重复读取包括读取两个不同的已提交值,而脏读包括读取尚未提交的值。很不一样。

于 2013-08-18T09:28:31.977 回答
16

这里:-

当一个事务读取另一个未提交事务写入的数据时,就会发生脏读。脏读的危险在于另一个事务可能永远不会提交,从而使原始事务留下“脏”数据。

当一个事务尝试访问相同的数据两次并且第二个事务在第一个事务的读取尝试之间修改数据时,就会发生不可重复读取。这可能会导致第一个事务读取相同数据的两个不同值,从而导致原始读取不可重复。

于 2013-08-18T09:29:08.903 回答
4

一张图片值1000字。

不可重复读取

在上图中,语句流如下所示:

  1. Alice 和 Bob 启动两个数据库事务。
  2. Alice 修改给定帖子记录的标题。
  3. Bob 读取未提交的帖子记录。
  4. 如果爱丽丝提交她的交易,一切都很好。但是如果 Alice 回滚,那么 Bob 将看到数据库事务日志中不再存在的记录版本。

这种异常只有 Read Uncommitted 隔离级别才允许,并且由于对数据完整性的影响,大多数数据库系统都提供了更高的默认隔离级别。

于 2018-07-13T10:59:14.717 回答
1

我和你以前一样困惑。

在我阅读了您帖子中的答案后,我决定从 mysql doc 中找出答案。

在阅读了 mysql 的文档后,我认为让我们感到困惑的是理解的角度。我们认为“tran A 更改了一条记录而没有提交,而 tran B 在前后读取了两个不同的数据,这确实是一个'脏数据'和'不可重复读取'”,我们感到困惑的是因为我们从两个交易行为的结果。

但是,正确的角度是:“脏读”是一个两次交易的事情,而“不可重复读”完全是一个一次交易的事情。

那是什么意思?例如,如果你是一个交易,我是你之后的一个交易。你读了一个X,我把它更新为Y,然后你再读一次。

对我们来说,您已经读取了脏数据,因为我没有提交,也许我想回滚。我让你读数据。

对你自己来说,在你自己的交易中,你读取了两个不同的数据,这是一个不可重复的数据。

有点冗长。可能会有所帮助。

参考文献: 1. https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_dirty_read
2. https://dev.mysql.com/doc/refman/8.0/en/glossary.html #glos_non_repeatable_read

于 2020-04-13T06:57:06.413 回答