首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不可重复读取和幻影读取之间的区别是什么?

不可重复读取和幻影读取之间的区别是什么?
EN

Stack Overflow用户
提问于 2012-06-15 09:54:04
回答 10查看 115.2K关注 0票数 195

不可重复读取和幻影读取之间的区别是什么?

我已经阅读了Isolation (database systems) article from Wikipedia,但我有一些疑问。在下面的示例中,将会发生什么:不可重复读取幻象读取

事务A

代码语言:javascript
复制
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1

输出:

代码语言:javascript
复制
1----MIKE------29019892---------5000

事务B

代码语言:javascript
复制
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;

事务A

代码语言:javascript
复制
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1

另一个疑问是,在上面的示例中,应该使用哪种隔离级别?为什么?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-06-15 13:17:37

From Wikipedia (它有很好的和详细的例子):

当在事务过程中检索一行两次,并且行中的值在两次读取之间不同时,就会发生不可重复的读取。

在事务过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询返回的行集合不同时,就会发生幻影读取。

简单的例子:

  • 用户A将同一查询运行两次。在这两者之间,用户B运行一个事务和commits.
  • Non-repeatable读取:用户A查询的A行在第二次time.
  • Phantom读取时具有不同的值:查询中的所有行在前后具有相同的值,但选择了不同的行(因为B删除或插入了一些行)。示例:如果添加或删除了行,即使没有任何受影响的行本身被更新,select sum(x) from table;也会返回不同的结果。

在上面的例子中,使用哪种隔离级别?

您需要什么隔离级别取决于您的应用程序。“更好的”隔离级别(比如降低的并发性)会带来很高的成本。

在您的示例中,您将不会有一个phantom,因为您只从一行(由主键标识)中进行选择。您可以使用不可重复的读取,因此如果这是一个问题,您可能需要一个隔离级别来防止这种情况。在Oracle中,事务A也可以发出SELECT FOR UPDATE,然后事务B在A完成之前不能更改行。

票数 205
EN

Stack Overflow用户

发布于 2014-04-18 00:41:45

我喜欢用一种简单的方式来思考它:

不可重复读取和幻影读取都与来自不同事务的数据修改操作有关,这些操作是在事务开始后提交的,然后由事务读取。

不可重复读取是指您的事务从另一个事务读取已提交的更新。同一行现在具有不同于事务开始时的值。

幻影读取是类似的,但是当从提交的读取时,插入和/或从另一个事务中删除。有一个或多个新行在您开始事务后消失了。

脏读与不可重复读和幻影读类似,但与读取未提交的数据有关,当从另一个事务读取更新、插入或删除,而另一个事务尚未提交数据时,就会发生脏读。它正在读取“正在进行”的数据,这些数据可能不完整,也可能永远不会被提交。

票数 161
EN

Stack Overflow用户

发布于 2018-07-01 21:08:33

不可重复读取异常如下所示:

重新读取post记录和transactions.

  • Bob’s列值为Transactions.

  • Alice将给定post记录的标题修改为ACID的值。

  • Alice提交她的数据库重新读取post记录,他将观察此表行的不同版本。

幻影读取异常可能如下所示:

  1. Alice和Bob start two数据库transactions.
  2. Bob’s读取与标识符值为1的post行关联的所有post_comment记录。
  3. Alice添加与标识符值为1的post行关联的新post_comment记录。
  4. Alice提交她的数据库,重新读取post_comment列值为1的post_id记录,他将观察此结果集的不同版本。

因此,当不可重复读取应用于单个行时,幻影读取是关于满足给定查询过滤条件的一系列记录。

票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11043712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档