分类:
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]