Chinaunix首页 | 论坛 | 博客
  • 博客访问: 598180
  • 博文数量: 825
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 4980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 14:19
文章分类

全部博文(825)

文章存档

2011年(1)

2008年(824)

我的朋友

分类:

2008-10-27 14:27:44

  写这个题目是由于看到论坛里面的一个帖子:http://www.itpub.net/thread-992141-1-1.html

  虽然不清楚楼主的具体目的是什么,但是楼主提出的问题确实有点意思。因为中根本没有读锁,楼主的要求和尽可能提高并发的目的是截然相反的。

  写这篇文章的目的并不是说这个需求有什么普遍性,而是为了说明在Oracle中其实没有什么是做不到的,即使这个需求和Oracle的设计本意相违背,另外希望这篇文章中的一些思路能起到抛砖引玉的作用。

  楼主提出的问题是“怎么样让一个表,一个时间只能一个人读”,简单概括一下就是建立起读锁的机制。而且这个读锁还不能是共享锁,而必须是有个独占锁。

  考虑到Oracle中根本不存在读锁,那么必须将思路进行转化。

  最先想到的是,将查询转化为DML,这样就可以获取到锁,避免其他用户对改对象同时进行访问。

  最简单的实现方式莫过于建立一个过程,在过程中首先LOCK TABLE,然后进行查询,将查询的结果返回。

  简单实现如下:


  SQL> CREATE TABLE T
  2 (
  3 ID NUMBER PRIMARY KEY,
  4 NAME VARCHAR2(30)
  5 );

  表已创建。

  SQL> INSERT INTO T SELECT ROWNUM, TNAME FROM TAB;

  已创建23行。

  SQL> COMMIT;

  提交完成。

  下面构建函数:

SQL> CREATE OR REPLACE FUNCTION F_QUERY_T RETURN SYS_REFCURSOR AS
  2 V_CURSOR SYS_REFCURSOR;
  3 BEGIN
  4 LOCK TABLE T IN EXCLUSIVE MODE;
  5 OPEN V_CURSOR FOR 'SELECT * FROM T';
  6 RETURN V_CURSOR;
  7 END;
  8 /

 

[1]   

【责编:Ken】

--------------------next---------------------

阅读(334) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~