问题描述
嗨,
我有一个场景,我必须从过滤和有序结果集中获取前10行以进行更新。
在多用户环境中,我们尝试使用SELECT FOR UPDATE跳过锁定。
让我举一个简单的例子
场景-1
会议-1
会议-2
在上面的例子中,我从Session-1得到结果,但不是从session-2 (假设emp表有100万记录)。
-
场景-2
会议-1
会议-2
在上面的例子中,我从Session-1得到结果,session-2也从rownum 11返回结果到20。
我正在使用Oracle数据库12c企业版12.1.0.2.0-64位
我是错过了什么还是这是一个错误?
您能否帮助我从每个会话中获取前n条记录,而会话之间没有共同记录?
我有一个场景,我必须从过滤和有序结果集中获取前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与 “更新跳过锁定” 有关。问题来自:
删除跳过锁定子句,你会看到仍然没有行:
为什么?
因为rownum从1开始。和增量after处理where子句。所以:
每一行都是假的。所以你什么也得不到!
在以下位置阅读有关此的更多信息:
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
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




