暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 选择更新跳过锁定失败

askTom 2018-07-19
561

问题描述

嗨,
我有一个场景,我必须从过滤和有序结果集中获取前10行以进行更新。
在多用户环境中,我们尝试使用SELECT FOR UPDATE跳过锁定。

让我举一个简单的例子

场景-1

会议-1

select emp_id from emp
where rownum>=1
and  rownum <=10
for update skip locked 
order by emp_id;



会议-2

select emp_id from emp
where  rownum>=11 
and  rownum <=20
for update skip locked 
order by emp_id;


在上面的例子中,我从Session-1得到结果,但不是从session-2 (假设emp表有100万记录)。

-
场景-2

会议-1

select emp_id from emp
where rownum>=1
and  rownum <=10
for update skip locked 
order by emp_id;



会议-2

select emp_id from emp
where  rownum>=1
and  rownum <=20
for update skip locked 
order by emp_id;


在上面的例子中,我从Session-1得到结果,session-2也从rownum 11返回结果到20。


我正在使用Oracle数据库12c企业版12.1.0.2.0-64位

我是错过了什么还是这是一个错误?

您能否帮助我从每个会话中获取前n条记录,而会话之间没有共同记录?


专家解答

这有nothing与 “更新跳过锁定” 有关。问题来自:

where  rownum>=11


删除跳过锁定子句,你会看到仍然没有行:

select count(*) from scott.emp
where  rownum>=11
and    rownum <=20;

COUNT(*)   
         0 


为什么?

因为rownum从1开始。和增量after处理where子句。所以:

where  rownum>=11


每一行都是假的。所以你什么也得不到!

在以下位置阅读有关此的更多信息:

https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:948366252775
https://blogs.oracle.com/oraclemagazine/on-rownum-and-limiting-results
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论