楼主: yangtingkun

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

[复制链接]
论坛徽章:
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
31#
发表于 2008-6-9 19:00 | 只看该作者
原帖由 zhaolinjnu 于 2008-6-9 18:30 发表



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

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


怎么判断是更新0行的,你是想在更新之前,先对做验证那张表做查询吧,这样用来做验证的表就可能会出现问题

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

使用道具 举报

回复
论坛徽章:
1
ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
32#
发表于 2008-6-9 20:20 | 只看该作者
up

使用道具 举报

回复
论坛徽章:
3
生肖徽章2007版:鼠
日期:2008-01-02 17:35:53奥运会纪念徽章:摔跤
日期:2008-06-09 21:45:262013年新春福章
日期:2013-02-25 14:51:24
33#
发表于 2008-6-9 21:57 | 只看该作者
学习

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期: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
34#
 楼主| 发表于 2008-6-9 22:36 | 只看该作者
原帖由 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语句中引入COMMIT,会破坏事务原子性的。

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2008-6-10 10:15 | 只看该作者
怎么破坏的?举个例子。

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期: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
36#
 楼主| 发表于 2008-6-10 10:54 | 只看该作者
如果你在一个事务当中查询这张表呢?

使用道具 举报

回复
论坛徽章:
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
37#
发表于 2008-6-10 11:12 | 只看该作者
看来你的环境,还挺复杂?如果不想破坏事务的原子性,只能把包含此表的查询的整个事务放在第二步。

请详细描述一下你的需求?为什么要去实现一个排它性的读锁?

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期: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
38#
 楼主| 发表于 2008-6-10 14:24 | 只看该作者
原帖由 zhaolinjnu 于 2008-6-10 11:12 发表
看来你的环境,还挺复杂?如果不想破坏事务的原子性,只能把包含此表的查询的整个事务放在第二步。

请详细描述一下你的需求?为什么要去实现一个排它性的读锁?



在这篇文章的开头部分我就写了

原帖由 yangtingkun 于 2008-5-27 11:04 发表
写这个题目是由于看到论坛里面的一个帖子:http://www.itpub.net/thread-992141-1-1.html
虽然不清楚楼主的具体目的是什么,但是楼主提出的问题确实有点意思。因为Oracle中根本没有读锁,楼主的要求和Oracle尽可能提高并发的目的是截然相反的。
写这篇文章的目的并不是说这个需求有什么普遍性,而是为了说明在Oracle中其实没有什么是做不到的,即使这个需求和Oracle的设计本意相违背,另外希望这篇文章中的一些思路能起到抛砖引玉的作用。

.
.
.


因此这篇文章并没有什么明确的需求,只是单纯为了实现读锁的功能,至于读锁有什么意义,我在日常使用中并没有碰到需要读锁的情况,但是并不代表一定没有意义。

你给出的方法,我只是说明这种方法会破坏事务的原子性,如果采用这种方法,对这张表的访问就无法放到事务当中。

另外,你的方法其实没有必要提交的,我的第一种方法就与你的方法类似,但是并没有提交,因此事务的原子性还可以保证。

使用道具 举报

回复
论坛徽章:
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
39#
发表于 2008-6-10 14:25 | 只看该作者


[ 本帖最后由 棉花糖ONE 于 2008-6-10 14:29 编辑 ]

使用道具 举报

回复
论坛徽章:
226
BLOG每日发帖之星
日期:2010-02-11 01:01:06紫蛋头
日期:2013-01-12 23:45:222013年新春福章
日期:2013-02-25 14:51:24问答徽章
日期:2013-10-17 18:06:40优秀写手
日期:2013-12-18 09:29:10马上有车
日期: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
40#
 楼主| 发表于 2008-6-10 14:34 | 只看该作者
原帖由 棉花糖ONE 于 2008-6-10 14:25 发表

使用道具 举报

回复

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

本版积分规则 发表回复

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