来自this oracle java教程:
当事务A检索行时发生不可重复的读取, 事务B随后更新行,然后更新事务A. 再次检索同一行。事务A检索同一行 两次,但看到不同的数据。
脏读和不可重复读之间的区别是什么?这不是一回事吗?因其他人的更新而读错了结果?
提前致谢。
答案 0 :(得分:15)
完全相同的页面解释了脏读的内容:
访问尚未提交的更新值被视为脏读,因为该值可能会回滚到其先前的值。如果您读取稍后回滚的值,则会读取无效值。
因此,非可重复读取包括读取两个不同的已提交值,而脏读取包括读取尚未提交的值。完全不同。
答案 1 :(得分:11)
来自here: -
当一个事务读取另一个事务写入的数据时,会发生 脏读, 未提交,交易。脏读的危险在于 其他事务可能永远不会提交,而是保留原始事务 用"脏"数据 当一个事务尝试访问时,会发生不可重复读取 相同的数据两次,第二次交易修改数据之间的数据 第一次交易的读取尝试。这可能会导致第一个 事务为同一数据读取两个不同的值,导致 原始阅读不可重复。
答案 2 :(得分:1)
一张图片价值1000字。
在上图中,正如我explained in this article一样,语句流如下所示:
此异常仅由“读取未提交”隔离级别允许,并且由于对数据完整性的影响,大多数数据库系统提供了更高的默认隔离级别。
答案 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