楼主: yangtingkun

[精华] 在Oracle中如何实现读锁

[复制链接]
论坛徽章:
273
生肖徽章2007版:猪
日期:2008-09-27 09:35:45明尼苏达森林狼
日期:2009-01-12 14:15:09生肖徽章2007版:猪
日期:2009-01-21 16:30:59布鲁克林篮网
日期:2009-03-03 14:42:32圣安东尼奥马刺
日期:2009-03-03 14:44:41生肖徽章2007版:鸡
日期:2009-03-03 21:45:52生肖徽章2007版:牛
日期:2009-03-09 14:03:42生肖徽章2007版:猪
日期:2009-03-10 21:37:00生肖徽章2007版:羊
日期:2009-03-16 10:17:11生肖徽章2007版:虎
日期:2009-03-24 21:26:52
21#
发表于 2008-6-7 22:18 | 只看该作者
精细访问控制特性原来真的不熟
学习了

使用道具 举报

回复
论坛徽章:
30
生肖徽章:马
日期:2007-03-01 11:03:29奥迪
日期:2013-12-21 17:12:36马上有钱
日期:2014-02-22 21:52:26马上有钱
日期:2014-03-24 21:24:59马上有车
日期:2014-04-27 20:14:42ITPUB元老
日期:2014-08-01 17:12:17授权会员
日期:2014-08-01 17:12:49青年奥林匹克运动会-自行车
日期:2014-09-10 10:14:58马上有车
日期:2014-12-18 16:13:59马上加薪
日期:2014-12-23 19:40:56
22#
发表于 2008-6-9 14:09 | 只看该作者
好东东。

使用道具 举报

回复
论坛徽章:
9
授权会员
日期:2007-06-18 19:35:12会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:牛
日期:2009-05-18 10:35:46祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:鸡
日期:2009-11-29 02:28:14ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
23#
发表于 2008-6-9 14:44 | 只看该作者
学习了!

使用道具 举报

回复
论坛徽章:
20
参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:002012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
24#
发表于 2008-6-9 16:36 | 只看该作者
首先不论此需求的合理性,对于此需求的实现,这里有另外一种思路?

首先创建另外一张表,插入一条类似下面这样的记录:
insert into select_ctl(table_name,lock_start,lock_end,status) values('TEST',SYSDATE,SYSDATE,0);
这张表可以称为对Test表的select查询访问控制表,status有两个状态:0 未锁定;1 锁定中

当要进行select查询时:
1.更新控制表select_ctl中的记录 update select_ctl set lock_start=sysdate,lock_end=null,status=1 where table_name='TEST' and status=0;
commit;
2.判断更新的结果集行数,如果为1,则进行相要的select查询(如果为0,则在应用层等待一下,再次返回到第一步中的更新):
    比如说: select * from test;
3.查询完成后,更新控制表select_ctl,以便其它的会话可以进行查询
  update select_ctl set lock_end=sysdate,status=0 where table_name='TEST' and status=1;
  commit;


如果这类的需求一定要处理,并且采用此设计实现,可以对select_ctl表中的记录进行监控。

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
25#
发表于 2008-6-9 16:44 | 只看该作者
原帖由 zhaolinjnu 于 2008-6-9 16:36 发表
首先不论此需求的合理性,对于此需求的实现,这里有另外一种思路?

首先创建另外一张表,插入一条类似下面这样的记录:
insert into select_ctl(table_name,lock_start,lock_end,status) values('TEST',SYSDATE,SYSDATE,0);
这张表可以称为对Test表的select查询访问控制表,status有两个状态:0 未锁定;1 锁定中

当要进行select查询时:
1.更新控制表select_ctl中的记录 update select_ctl set lock_start=sysdate,lock_end=null,status=1 where table_name='TEST' and status=0;
commit;
2.判断更新的结果集行数,如果为1,则进行相要的select查询(如果为0,则在应用层等待一下,再次返回到第一步中的更新):
    比如说: select * from test;
3.查询完成后,更新控制表select_ctl,以便其它的会话可以进行查询
  update select_ctl set lock_end=sysdate,status=0 where table_name='TEST' and status=1;
  commit;


如果这类的需求一定要处理,并且采用此设计实现,可以对select_ctl表中的记录进行监控。


你这么设计是会出问题的,select 和update select_ctl表之间这个时间点,如果有另一个人也访问行,一样是能同时读到行,同时commit还得进行做日志同步,如果log file sync的等待很严重,这时候出现大家同时访问一行的概率就越大,这么设计必然导致commit频繁

[ 本帖最后由 棉花糖ONE 于 2008-6-9 16:47 编辑 ]

使用道具 举报

回复
论坛徽章:
138
19周年集字徽章-19
日期:2020-06-08 08:30:56马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02路虎
日期:2013-11-22 12:26:18问答徽章
日期:2014-05-08 12:15:31
26#
发表于 2008-6-9 16:46 | 只看该作者
真搞不懂做读阻塞读的意义在哪

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2007-07-08 18:54:592009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2008-10-24 16:46:51奥运会纪念徽章:现代五项
日期:2008-10-24 13:26:49生肖徽章2007版:羊
日期:2008-04-17 18:05:112008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
27#
发表于 2008-6-9 17:52 | 只看该作者
原帖由 棉花糖ONE 于 2008-6-9 16:44 发表


你这么设计是会出问题的,select 和update select_ctl表之间这个时间点,如果有另一个人也访问行,一样是能同时读到行,同时commit还得进行做日志同步,如果log file sync的等待很严重,这时候出现大家同时访问一行的概率就越大,这么设计必然导致commit频繁



确实存在问题,在高并发的情况下。

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2007-07-08 18:54:592009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2008-10-24 16:46:51奥运会纪念徽章:现代五项
日期:2008-10-24 13:26:49生肖徽章2007版:羊
日期:2008-04-17 18:05:112008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
28#
发表于 2008-6-9 17:55 | 只看该作者
不知道在线上库中,有多DB会用FGA?

太消耗资源是最大的问题,撤远了

使用道具 举报

回复
论坛徽章:
20
参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:002012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
29#
发表于 2008-6-9 18:23 | 只看该作者
它这个需求,要实现排它的读锁,本身这张表,访问量应该是不高的吧!

如果访问量很大,不管采用何种实现方式,都会造成很大问题的。

使用道具 举报

回复
论坛徽章:
20
参与2007年甲骨文全球大会(中国上海)纪念
日期:2007-08-06 15:19:002012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:522012新春纪念徽章
日期:2012-02-13 15:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:09:52
30#
发表于 2008-6-9 18:30 | 只看该作者
原帖由 棉花糖ONE 于 2008-6-9 16:44 发表


你这么设计是会出问题的,select 和update select_ctl表之间这个时间点,如果有另一个人也访问行,一样是能同时读到行,同时commit还得进行做日志同步,如果log file sync的等待很严重,这时候出现大家同时访问一行的概率就越大,这么设计必然导致commit频繁



至于log file sync会很严重的问题,稍微变一下程序逻辑就可以解决,

因为如果更新的结果集为0条,则不需要进行commit操作。

使用道具 举报

回复

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

本版积分规则 发表回复

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