不可重复读和幻读有什么区别?
我已经阅读了来自 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;
另一个疑问是,在上面的例子中,应该使用哪个隔离级别?为什么?
来自维基百科(其中有很好的详细示例):
发生不可重复读取时,在事务过程中,行被检索两次并且行内的值在读取之间不同。
和
当在事务过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个不同时,就会发生幻读。
简单的例子:
select sum(x) from table;
在上面的例子中,要使用哪个隔离级别?
您需要什么隔离级别取决于您的应用程序。“更好”的隔离级别(例如降低并发性)的成本很高。
在您的示例中,您不会进行幻读,因为您仅从单行中选择(由主键标识)。您可以进行不可重复读取,因此如果这是一个问题,您可能需要一个隔离级别来防止这种情况发生。在 Oracle 中,事务 A 也可以发出 SELECT FOR UPDATE,然后事务 B 在 A 完成之前不能更改行。