gpt4 book ai didi

database - 不可重复读和幻读有什么区别?

转载 作者:太空狗 更新时间:2023-10-30 01:36:59 24 4
gpt4 key购买 nike

不可重复读幻读有什么区别?

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

####事务 A

SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1

####输出:

1----MIKE------29019892---------5000

####事务 B

UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;

####事务 A

SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1

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

最佳答案

From Wikipedia (其中有很好的详细示例):

A non-repeatable read occurs, when during the course of a transaction, a row is retrieved twice and the values within the row differ between reads.

A phantom read occurs when, in the course of a transaction, two identical queries are executed, and the collection of rows returned by the second query is different from the first.

简单的例子:

  • 用户 A 运行同一个查询两次。
  • 在此期间,用户 B 运行事务并提交。
  • 不可重复读:用户A查询到的A行第二次有不同的值。
  • 幻读:查询中的所有行在前后具有相同的值,但正在选择不同的行(因为 B 删除或插入了一些)。示例:select sum(x) from table; 将返回不同的结果,即使受影响的行本身都没有更新,如果行已被添加或删除。

In the above example,which isolation level to be used?

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

在你的例子中,你不会有幻读,因为你只从一行中选择(由主键标识)。你可以有不可重复的读取,所以如果这是一个问题,你可能希望有一个隔离级别来防止它。在 Oracle 中,事务 A 也可以发出 SELECT FOR UPDATE,然后事务 B 不能更改行,直到 A 完成。

关于database - 不可重复读和幻读有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com