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

Rol*_*all 15 java database transactions jdbc

这个 oracle java教程:

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

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

提前致谢.

JB *_*zet 17

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

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

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

  • 只在事务持续时间内保证可重复读取:启动事务T1,读取A1,然后另一个事务T2将A1修改为A2并提交,然后第一个事务T1重新读取该值,仍然读取A1.这是一个可重复的阅读.当然,在T2提交之后第一次读取值的另一个事务T3将读取提交的值A2.要了解数据库是如何实现的,请阅读其文档.他们中的大多数使用[MVCC](http://en.wikipedia.org/wiki/Multiversion_concurrency_control),AFAIK. (2认同)

Rah*_*thi 11

这里: -

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

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


Vla*_*cea 5

一张图片胜过1000个字。

不可重复读取

在上图中,语句流程如下:

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

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