DBMS_LOCK包的学习

摘要:
DBMS_了解LOCK包。了解DBMS_LOCK包的用法。该材料的描述和示例非常详细。找到它不容易,哈哈。

DBMS_LOCK包的学习

    学习一下DBMS_LOCK包的用法。这份材料的说明和举例都很详细了,好不容易才找到的,哈哈。

General Information
Source{ORACLE_HOME}/rdbms/admin/dbmslock.sql
First Available7.3.4

Constants
NameDescriptionData TypeValue
nl_mode
NuLlINTEGER1
ss_mode
Sub Shared: used on an aggregate object to indicate that share locks are being acquired on subparts of the objectINTEGER2
sx_mode
Sub eXclusive: used on an aggregate object to indicate that exclusive locks are being acquired on sub-parts of the objectINTEGER3
s_mode
Shared: indicates that the entire aggregate object has a share lock, but some of the sub-parts may additionally have exclusive locksINTEGER4
ssx_mod
Shared SubeXclusiveINTEGER5
x_mode
eXclusiveINTEGER6

Dependencies
SELECT referenced_name
FROM dba_dependencies
WHERE name = 'DBMS_LOCK'
UNION
SELECT name
FROM dba_dependencies
WHERE referenced_name = 'DBMS_LOCK';
Exceptions
Error NumberDescription

ORA-20000

Unable to find or insert lock <lockname> into catalog dbms_lock_allocated.
ORU-10003Unable to find or insert lock <lockname> into catalog dbms_lock_allocated.
Object PrivilegesGRANT execute ON dbms_lock TO <schema_name>
GRANT execute ON dbms_lock TO uwclass;
ALLOCATE_UNIQUE
Allocates a unique lock identifier (in the range of 1073741824 to 1999999999) given a lock name. Lock identifiers are used to enable applications to coordinate their use of locksdbms_lock.allocate_unique(
lockname        IN VARCHAR2,
lockhandle      OUT VARCHAR2,
expiration_secs IN INTEGER DEFAULT 864000);
See dbms_lock demo
CONVERT

Converts a lock from one mode to another

Overload 1
dbms_lock.convert(
id       IN INTEGER,
lockmode IN INTEGER,
timeout IN NUMBER DEFAULT maxwait)
RETURN INTEGER;
Return Values
0Success
1Timeout
2Deadlock
3Parameter error
4Don't own lock specified by id or lockhandle
5Illegal lock handle
See dbms_lock demo

Overload 2
dbms_lock.convert(
lockhandle IN VARCHAR2,
lockmode   IN INTEGER,
timeout    IN NUMBER DEFAULT maxwait)
RETURN INTEGER;
See dbms_lock demo
RELEASE

Explicitly releases a lock previously acquired using the REQUEST function

Overload 1
dbms_lock.release(id IN INTEGER) RETURN INTEGER;
Return Values
0Success
3Parameter error
4Don't own lock specified by id or lockhandle
5Illegal lock handle
See dbms_lock demo
Overload 2dbms_lock.release(lockhandle IN VARCHAR2) RETURN INTEGER;
See dbms_lock demo
REQUEST

Requests a lock with a given mode

Overload 1
dbms_lock.request(
id                IN INTEGER,
lockmode          IN INTEGER DEFAULT x_mode,
timeout           IN INTEGER DEFAULT maxwait,
release_on_commit IN BOOLEAN DEFAULT FALSE)
RETURN INTEGER;
Return Values
0Success
1Timeout
2Deadlock
3Parameter error
4Don't own lock specified by id or lockhandle
5Illegal lock handle
See dbms_lock demo

Overload 2
dbms_lock.request(
lockhandle        IN VARCHAR2,
lockmode          IN INTEGER DEFAULT x_mode,
timeout           IN INTEGER DEFAULT maxwait,
release_on_commit IN BOOLEAN DEFAULT FALSE)
RETURN INTEGER;
See dbms_lock demo
SLEEP
Suspends the session for a given period of timedbms_lock.sleep(seconds IN NUMBER);
exec dbms_lock.sleep(1.00);
Demo
-- create demo table 

CREATE TABLE lock_test (
action VARCHAR2(10),
when   TIMESTAMP(9));

GRANT insert ON lock_test TO public;

CREATE OR REPLACE PACKAGE lock_demo IS
v_lockname   VARCHAR2(12) := 'control_lock';
v_lockhandle VARCHAR2(200);
v_result     PLS_INTEGER;

-- obtain a lock
PROCEDURE request_lock(p_ltype INTEGER, p_retval OUT INTEGER);
-- release an existing lock
PROCEDURE release_lock(p_retval OUT INTEGER);
-- view the stored handle
FUNCTION see_handle RETURN VARCHAR2;
-- decode lock request
FUNCTION decode_req(p_result PLS_INTEGER) RETURN VARCHAR2;
-- decode lock release
FUNCTION decode_rel(p_result PLS_INTEGER) RETURN VARCHAR2;

END lock_demo;
/


CREATE OR REPLACE PACKAGE BODY lock_demo IS

PROCEDURE request_lock(p_ltype IN INTEGER, p_retval OUT INTEGER) IS
BEGIN
IF v_lockhandle IS NULL THEN
    dbms_lock.allocate_unique(v_lockname, v_lockhandle);
    p_retval := dbms_lock.request(v_lockhandle, p_ltype);
END IF;
END request_lock;
------------------------------------------------------------
PROCEDURE release_lock(p_retval OUT INTEGER) IS
BEGIN
IF v_lockhandle IS NOT NULL THEN
    p_retval := dbms_lock.release(v_lockhandle);
END IF;
END release_lock;
------------------------------------------------------------
FUNCTION see_handle RETURN VARCHAR2 IS
BEGIN
IF v_lockhandle IS NOT NULL THEN
    RETURN v_lockhandle;
ELSE
    RETURN 'Not Allocated';
END IF;
END see_handle;
------------------------------------------------------------
FUNCTION decode_req(p_result PLS_INTEGER) RETURN VARCHAR2 IS
retval VARCHAR2(20);
BEGIN
SELECT DECODE(p_result,0,'Success',1,'Timeout',2,'Deadlock',
3,'Parameter Error',4,'Already owned',5,'Illegal Lock Handle')
INTO retval
FROM dual;

RETURN retval;
END decode_req;
------------------------------------------------------------
FUNCTION decode_rel(p_result PLS_INTEGER) RETURN VARCHAR2 IS
retval VARCHAR2(20);
BEGIN
SELECT DECODE(p_result,0,3, 'Parameter Error',4, 'Already owned',
5, 'Illegal Lock Handle')
INTO retval
FROM dual;

RETURN retval;
END decode_rel;
------------------------------------------------------------
END lock_demo;
/

GRANT execute ON lock_demo TO public;


set serveroutput on

-- get an exclusive lock in the current session (Session 1)
DECLARE
s VARCHAR2(200);
BEGIN
lock_demo.request_lock(6, s);
dbms_output.put_line(s);
END;
/

/* Two session request a shared lock (ss_mode). The shared lock cannot be acquired because session 1 holds an exclusive lock. Execution will stop on the request until the the exclusive lock is released. */
Session 2Session 3
set serveroutput on

DECLARE
s VARCHAR2(200);
BEGIN
uwclass.lock_demo.request_lock(
dbms_lock.ss_mode, s);

dbms_output.put_line(s);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('started', SYSTIMESTAMP);

dbms_lock.sleep(5);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('ended', SYSTIMESTAMP);
COMMIT;
END;
/
set serveroutput on

DECLARE
s VARCHAR2(200);
BEGIN
uwclass.lock_demo.request_lock(
dbms_lock.ss_mode, s);

dbms_output.put_line(s);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('started', SYSTIMESTAMP);

dbms_lock.sleep(5);

INSERT INTO uwclass.lock_test
(action, when)
VALUES
('ended' , SYSTIMESTAMP);
COMMIT;
END;
/

-- Session 1 releases its lock
DECLARE
s VARCHAR2(200);
BEGIN
lock_demo.release_lock(s);
dbms_output.put_line(s);
END;


-- Execution resumes when the exclusive lock is released 
SELECT TO_CHAR(when,'dd.mm.yyyy hh24:mi:ss'), action
FROM lock_test
ORDER BY when;
http://www.blogjava.net/decode360/archive/2009/08/19/291823.html 
 

免责声明:文章转载自《DBMS_LOCK包的学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt下开发及调用带界面的DLLjs实现Mac触摸板双指事件(上/下/左/右/放大/缩小)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DBA常用脚本 二、性能监控

二、性能监控 1、数据缓冲区的命中率已经不是性能调整中的主要问题了,但是,过低的命中率肯定是不可以的,在任何情况下,我们必须保证有一个大的data buffer和一个高的命中率。 这个语句可以获得整体的数据缓冲命中率,越高越好 SELECT a.VALUE + b.VALUE logical_reads, c.VALUE phys_reads, round...

python3使用imaplib获取邮件

imaplib 获取邮件,email解析邮件config文件中存有路径 1 # config.py 2 FILE_PATH_PREFIX = os.getcwd() + '/static/' 3 FILE_PATH_PREFIX_ALIAS = "/static/" 4 FILE_DOMAIN_PREFIX = 'http://0.0.0.0:8090...

【Gstreamer开发】TI嵌入式处理器GStreamer pipeline

Example GStreamer Pipelines From Texas Instruments Embedded Processors Wiki Jump to: navigation, search Translate this page to Translate Example GStreamer Pipelines MAINTENANCE...

kaldi 三个脚本cmd.sh path.sh run.sh

参考 kaldi的全部资料_v0.4 cmd.sh 脚本为: 可以很清楚的看到有 3 个分类分别对应 a,b,c。a 和 b 都是集群上去运行这个样子, c 就是我们需要的。我们在虚拟机上运行的。你需要修改这个脚本 # "queue.pl"uses qsub. The options to it are # options to qsub. If yo...

decode用法

在查询数据,需要进行条件判断时,一般我们使用CASE...WHEN实现,当判断条件为相等时,除了使用CASE...WHEN实现,还可以使用DECODE函数。若要使用like、>、<等其他判断条件时,就只能使用CASE...WHEN实现了。 下面就解释下DECODE()函数的用法。 DECODE()使用方法:  decode(条件,值1,翻译值1...

2.NULL 的问题

/*************************************************二、主题:NULL 的问题 *************************************************/    CREATE TABLE TEST1    (           ID   NUMBER(1) NOT NULL PRI...