有什么区别不可重复读 and 幻读?
我已阅读维基百科的隔离(数据库系统)文章,但我有一些疑问。在下面的示例中,将会发生什么:不可重复读 and 幻读?
####交易A
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
####OUTPUT:
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
另一个疑问是,在上面的例子中,应该使用哪种隔离级别?为什么?
来自维基百科(其中有很棒且详细的示例):
当在事务过程中,一行被检索两次并且该行中的值在两次读取之间不同时,就会发生不可重复读取。
and
当在事务过程中执行两个相同的查询并且第二个查询返回的行集合与第一个查询不同时,就会发生幻读。
简单的例子:
- 用户 A 运行相同的查询两次。
- 在这期间,用户 B 运行事务并提交。
- 不可重复读:用户A第二次查询到的A行的值不同。
- 幻读:查询中的所有行前后都有相同的值,但正在选择不同的行(因为B删除或插入了一些)。例子:
select sum(x) from table;
如果添加或删除了行,即使受影响的行本身没有被更新,也会返回不同的结果。
在上面的例子中,使用哪个隔离级别?
您需要什么隔离级别取决于您的应用程序。 “更好”的隔离级别(例如降低并发性)的成本很高。
在您的示例中,您不会出现幻读,因为您仅从单行(由主键标识)中进行选择。您可以进行不可重复的读取,因此如果这是一个问题,您可能需要一个隔离级别来防止这种情况发生。在 Oracle 中,事务 A 也可以发出 SELECT FOR UPDATE,然后事务 B 无法更改该行,直到 A 完成为止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)