子查询的事务级别

时间:2013-12-30 22:27:00

标签: oracle subquery

我想从表中删除重复的行,并在SO(Removing duplicate rows from table in Oracle

处找到此解决方案
DELETE FROM your_table -- step 2
WHERE rowid not in
(SELECT MIN(rowid) -- step 1
FROM your_table
GROUP BY column1, column2, column3);

如果在步骤1之后但在步骤2之前插入了行,会发生什么情况?如果是,我应该使用什么交易级别来避免它?

1 个答案:

答案 0 :(得分:1)

来自the concepts guide

  

在读提交的隔离级别(默认值)中   由事务执行的查询只能查看在之前提交的数据   查询 - 不是交易开始。

     

...

     

读取已提交事务中的查询可以避免读取数据   在查询正在进行时提交。

     

...

     

为每个查询提供一致的结果集,保证数据   一致性,没有用户的动作。隐式查询,例如   WHERE语句中UPDATE子句隐含的查询是   保证一致的结果。但是,每个声明都在   隐式查询没有看到DML语句所做的更改   本身,但看到更改之前存在的数据。

最后一段也适用于您的案例,仅适用于DELETE而不是UPDATE。您的语句 - 删除本身和子查询是单个语句 - 是隔离的,因此它不会受到任何其他会话或事务中所做的任何更改的影响。在执行语句时,您不会“看到”任何插入其他行的行,无论它们是否已被提交。

因此您无需更改默认隔离级别。

相关问题