查看: 19877|回复: 42

[精华] 出一个关于Skip Locked的小题目

[复制链接]
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
跳转到指定楼层
1#
发表于 2008-9-23 16:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大家不要上机实验, 凭你的经验和推断, 给出本小题目的答案.
如果做了试验再来回答就没啥意思了

create table t(id number not null);
insert into t values(1);
insert into t values(2);
insert into t values(3);
commit;

现在连续两次执行同一个SQL语句,如下:
SQL>select * from t where rownum <= 1 for update skip locked;

        ID
----------
         1

1 row selected.

SQL>select * from t where rownum <= 1 for update skip locked;

请问: 这里应该显示什么结果?

A. B. C. D.
no rows selected
         ID
----------
         1

1 row selected.
         ID
----------
         2

1 row selected.
         ID
----------
         3

1 row selected.










现在再开启另一个 SESSION窗口执行:
SQL>select * from t where rownum <= 1 for update skip locked;
那么再次请问: 这里又应该显示什么结果?
选项和前面相同.
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
2#
 楼主| 发表于 2008-9-23 16:15 | 只看该作者
此题目, 可能对于一些新手还不知道 SKIP LOCKED 是干什么用的. 呵呵.

1. 我们看看第一个结果, 应该是 B.
这个小知识点地球人都知道, 就是: 同一个SESSION的锁定可以重复获取.

2. 第二题的结果是 A.
我们分析一下为什么出现这个结果,初看感觉是前面的SESSION锁定了全部的记录.
但我们从第二个SESSION 窗口中执行以下语句:
SQL> select * from t for update skip locked;

        ID
----------
         2
         3

2 rows selected.
可以发现后面两条记录并没有被第一个SESSION锁定.
那为何 select * from t where rownum <= 1 for update skip locked; 这个就 no rows 呢?
其实是因为 for update 执行情况我们误解了.
对于存在  for update 的SQL语句, Oracle 首先在没有 For Update 的情况下选取出满足条件的记录.
然后对选取出的记录进行 Lock.  如果后 Skip Locked, 那么在锁定记录的时候对于满足条件的记录中已经被锁定的将会再次被筛选掉.
这就是For update skip locked 的执行过程.

我们第一个SESSION 中锁定了第一条记录(Rownum <=1 ), 第二个SESSION 中依然按照 (Rownum<=1) 取到第一条ID=1的记录,
在后继执行 For Update Skip Locked 的时候发现记录被锁定, 则被筛选掉, 那么最终结果就是 no rows 了.

总结: Skip Locked 是在SQL查询结果集的基础上进行二次筛选.
增加一个由 kmpx 发现的一个知识点: 使用了 For Update 查询的表上会放置一个 MODE=3 的 TM 锁定, 而不管该查询是否查询到数据.

[ 本帖最后由 nyfor 于 2008-9-24 08:53 编辑 ]

使用道具 举报

回复
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
3#
发表于 2008-9-23 16:19 | 只看该作者
我不知道,学习

使用道具 举报

回复
论坛徽章:
27
设计板块每日发贴之星
日期:2007-08-24 01:05:17奥运会纪念徽章:拳击
日期:2012-06-25 14:17:112012新春纪念徽章
日期:2012-01-04 11:49:54生肖徽章2007版:龙
日期:2009-04-07 18:18:35生肖徽章2007版:鸡
日期:2008-10-14 14:14:30生肖徽章2007版:龙
日期:2008-10-08 21:22:20铁扇公主
日期:2008-09-28 11:20:58授权会员
日期:2008-09-05 13:30:44ITPUB元老
日期:2008-09-05 13:30:31奥运会纪念徽章:摔跤
日期:2008-07-26 08:05:05
4#
发表于 2008-9-23 16:20 | 只看该作者
选 B,C试验了下,和答案不符
的确不知道skip locked是做什么的:(

[ 本帖最后由 阿日 于 2008-9-24 15:18 编辑 ]

使用道具 举报

回复
论坛徽章:
66
现任管理团队成员
日期:2011-05-07 01:45:08版主9段
日期:2013-04-21 02:21:02ITPUB年度最佳版主
日期:2014-02-19 10:05:27ITPUB年度最佳版主
日期:2013-01-30 17:30:25ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05优秀写手
日期:2013-12-18 09:29:15元宝章
日期:2015-02-10 19:57:54金牌徽章
日期:2015-02-10 19:59:42银牌徽章
日期:2015-02-10 19:59:42铜牌徽章
日期:2015-02-10 19:59:41
5#
发表于 2008-9-23 16:21 | 只看该作者
B,第一次skip locked没有用的

同一个session下其实效果跟

SQL>select * from t where rownum <= 1 for update ;
        ID
----------
         1

1 row selected.

SQL>select * from t where rownum <= 1 for update skip locked;

是一样的

[ 本帖最后由 wangfans 于 2008-9-23 16:30 编辑 ]

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
6#
 楼主| 发表于 2008-9-23 16:24 | 只看该作者
Skip Locked 是跟在 For Update 后面一起用的. 因为 For Update 需要锁定记录, 如果别人锁定了你要的记录, 那么除非你使用 nowait 子句将会无限等待其它用户释放锁定. 如果你使用 Skip Locked, 那么对于已经锁定的记录将会跳过.

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
7#
发表于 2008-9-23 16:31 | 只看该作者
(1)什么时候必须要用?
(2)”for update skip locked;“和“for update nowait skip locked;”有什么区别?

使用道具 举报

回复
论坛徽章:
66
皇马
日期:2009-02-13 09:38:532011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:柔道
日期:2011-04-08 23:11:212010广州亚运会纪念徽章:排球
日期:2011-04-18 22:00:58鲜花蛋
日期:2011-05-30 21:23:49ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15迷宫蛋
日期:2012-12-18 23:39:42问答徽章
日期:2013-09-25 16:14:23优秀写手
日期:2015-02-12 06:00:13
8#
发表于 2008-9-23 16:31 | 只看该作者
原帖由 nyfor 于 2008-9-23 16:24 发表
Skip Locked 是跟在 For Update 后面一起用的. 因为 For Update 需要锁定记录, 如果别人锁定了你要的记录, 那么除非你使用 nowait 子句将会无限等待其它用户释放锁定. 如果你使用 Skip Locked, 那么对于已经锁定的记录将会跳过.



解释的很好  学习了

使用道具 举报

回复
论坛徽章:
281
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-01-04 11:51:22蛋疼蛋
日期:2011-12-29 07:37:22迷宫蛋
日期:2011-12-26 14:19:41茶鸡蛋
日期:2011-11-17 09:20:52茶鸡蛋
日期:2011-11-10 22:42:38ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15茶鸡蛋
日期:2011-10-24 09:48:48ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47
9#
发表于 2008-9-23 16:34 | 只看该作者
第2道题的结果未在我意料之中啊

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
10#
 楼主| 发表于 2008-9-23 16:35 | 只看该作者
原帖由 bell6248 于 2008-9-23 16:31 发表
(1)什么时候必须要用?
==>这个要看你自己的运用, 无法规定说什么时候必须要用, 同样的功能有多种实现方法.

(2)”for update skip locked;“和“for update nowait skip locked;”有什么区别?
==> 这里的 nowait 与 skip locked 同时使用时 nowait 将无效

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表