小编典典

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

all

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

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

交易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

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


阅读 66

收藏
2022-06-21

共1个答案

小编典典

来自维基百科(其中有很好的详细示例):

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

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

简单的例子:

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

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

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

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

2022-06-21