不可重复读取和幻影读取之间的区别是什么?
我已经阅读了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
另一个疑问是,在上面的示例中,应该使用哪种隔离级别?为什么?
发布于 2012-06-15 13:17:37
From Wikipedia (它有很好的和详细的例子):
当在事务过程中检索一行两次,并且行中的值在两次读取之间不同时,就会发生不可重复的读取。
和
在事务过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询返回的行集合不同时,就会发生幻影读取。
简单的例子:
select sum(x) from table;
也会返回不同的结果。在上面的例子中,使用哪种隔离级别?
您需要什么隔离级别取决于您的应用程序。“更好的”隔离级别(比如降低的并发性)会带来很高的成本。
在您的示例中,您将不会有一个phantom,因为您只从一行(由主键标识)中进行选择。您可以使用不可重复的读取,因此如果这是一个问题,您可能需要一个隔离级别来防止这种情况。在Oracle中,事务A也可以发出SELECT FOR UPDATE,然后事务B在A完成之前不能更改行。
发布于 2014-04-18 00:41:45
我喜欢用一种简单的方式来思考它:
不可重复读取和幻影读取都与来自不同事务的数据修改操作有关,这些操作是在事务开始后提交的,然后由事务读取。
不可重复读取是指您的事务从另一个事务读取已提交的更新。同一行现在具有不同于事务开始时的值。
幻影读取是类似的,但是当从提交的读取时,插入和/或从另一个事务中删除。有一个或多个新行在您开始事务后消失了。
脏读与不可重复读和幻影读类似,但与读取未提交的数据有关,当从另一个事务读取更新、插入或删除,而另一个事务尚未提交数据时,就会发生脏读。它正在读取“正在进行”的数据,这些数据可能不完整,也可能永远不会被提交。
发布于 2018-07-01 21:08:33
不可重复读取异常如下所示:
重新读取post记录和transactions.
幻影读取异常可能如下所示:
因此,当不可重复读取应用于单个行时,幻影读取是关于满足给定查询过滤条件的一系列记录。
https://stackoverflow.com/questions/11043712
复制相似问题