我想从表中删除重复的行,并在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之前插入了行,会发生什么情况?如果是,我应该使用什么交易级别来避免它?
答案 0 :(得分:1)
在读提交的隔离级别(默认值)中 由事务执行的查询只能查看在之前提交的数据 查询 - 不是交易开始。
...
读取已提交事务中的查询可以避免读取数据 在查询正在进行时提交。
...
为每个查询提供一致的结果集,保证数据 一致性,没有用户的动作。隐式查询,例如
WHERE
语句中UPDATE
子句隐含的查询是 保证一致的结果。但是,每个声明都在 隐式查询没有看到DML语句所做的更改 本身,但看到更改之前存在的数据。
最后一段也适用于您的案例,仅适用于DELETE
而不是UPDATE
。您的语句 - 删除本身和子查询是单个语句 - 是隔离的,因此它不会受到任何其他会话或事务中所做的任何更改的影响。在执行语句时,您不会“看到”任何插入其他行的行,无论它们是否已被提交。
因此您无需更改默认隔离级别。