不可重复读取与脏读取之间的区别

时间:2013-08-18 09:23:37

标签: java database jdbc transactions

来自this oracle java教程:

  

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

脏读和不可重复读之间的区别是什么?这不是一回事吗?因其他人的更新而读错了结果?

提前致谢。

4 个答案:

答案 0 :(得分:15)

完全相同的页面解释了脏读的内容:

  

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

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

答案 1 :(得分:11)

来自here: -

  当一个事务读取另一个事务写入的数据时,会发生 脏读,   未提交,交易。脏读的危险在于   其他事务可能永远不会提交,而是保留原始事务   用"脏"数据

     当一个事务尝试访问时,会发生

不可重复读取   相同的数据两次,第二次交易修改数据之间的数据   第一次交易的读取尝试。这可能会导致第一个   事务为同一数据读取两个不同的值,导致   原始阅读不可重复。

答案 2 :(得分:1)

一张图片价值1000字。

enter image description here

在上图中,正如我explained in this article一样,语句流如下所示:

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

此异常仅由“读取未提交”隔离级别允许,并且由于对数据完整性的影响,大多数数据库系统提供了更高的默认隔离级别。

答案 3 :(得分:0)

我和你以前一样困惑。

在阅读您帖子中的答案后,我决定从mysql文档中查找。

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

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

那是什么意思?例如,如果您是交易,而我是您之后的交易。您读了一个X,我将其更新为Y,然后又读了一次。

到美国,您读了一个肮脏的数据,因为我没有提交,也许我想回滚。我让你读取了dity数据。

对于您自己,在您自己的事务中,您读取了两个不同的数据,这是不可重复的数据。

有点冗长。可能有帮助。

参考: 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